簡體   English   中英

搜索和顯示結果[java]

[英]Search & display results [java]

我經營一個小型的在線游戲社區,並處理帳戶數據庫。

設置是這樣的:

名為“帳戶”的文件夾在“帳戶”目錄中,有200,000多個按播放器名稱組織的文本文件。 手動訪問此文件夾很麻煩,因為需要使用RAM來獲取和搜索文件。 我覺得這很不方便。

我訪問此目錄以發送密碼提醒或誰在玩時間最長的游戲中獲得高分。

這是一個帳戶文件的示例。 該文件名為Falcon.txt

[ACCOUNT]
character-username = Falcon
character-password = falconpassword

[INFO]
character-coordx = 3252
character-coordy = 3432
character-active = yes
character-ismember = 1
character-messages = 5
character-lastconnection = [removed]
character-lastlogin = 2009-11-29
character-energy = 100
character-gametime = 193
character-gamecount = 183

[EQUIPMENT]
character-equip = 0 4724    0   
character-equip = 1 1052    0   
character-equip = 2 6585    0   
character-equip = 3 4151    0   
character-equip = 4 4720    0   
character-equip = 5 1215    0   
character-equip = 6 -1  0   
character-equip = 7 4722    0   
character-equip = 8 -1  0   
character-equip = 9 775 0   
character-equip = 10    1837    0   
character-equip = 11    -1  0   
character-equip = 12    6735    0   
character-equip = 13    -1  0   

[APPEARANCE]
character-look = 0  1
character-look = 1  1
character-look = 2  2
character-look = 3  3
character-look = 4  5
character-look = 5  2

[STATS]
character-skill = 0 1   0
character-skill = 1 1   0
character-skill = 2 1   0
character-skill = 3 1   0
character-skill = 4 1   0
character-skill = 5 1   0
character-skill = 6 1   0
character-skill = 7 1   0
character-skill = 8 1   0
character-skill = 9 1   0
character-skill = 10    1   0
character-skill = 11    1   0
character-skill = 12    1   0
character-skill = 13    1   0
character-skill = 14    1   0
character-skill = 15    1   0
character-skill = 16    1   0
character-skill = 17    1   0
character-skill = 18    1   0
character-skill = 19    1   0
character-skill = 20    1   0

[ITEMS]

[BANK]

[FRIENDS]

[IGNORES]

[END]

有一個龐大的數據庫,可以在文件中的目錄中搜索值。

我指的是通過商品ID或IP地址查找和跟蹤其他帳戶的值。

但是,我遇到了一個新問題,我的開發正在崩潰。

如您在文件中看到的,這些行是按選項卡組織的。

character-equip = 0    4724    1 

如果我在搜索應用程序中輸入值4724,則希望它在找到的搜索結果右側打印出值1標簽。 我希望它僅打印找到的結果的值,而不是多余的結果。

因此搜索可能如下所示:

1“輸入要查找的項目:”
2“輸入要查找的項目:4724”
3“帳戶Falcon.txt有1個!”
按任意鍵繼續...

或者如果該裝備的物品數量更多

character-equip = 5    1239    102

1.“輸入要查找的項目:”
2.“輸入要查找的項目:1239”
3.“帳戶Falcon2.txt有102個!”
按任意鍵繼續...

我只想輸入一個項目ID,並讓它在找到的值之后顯示值。 空格是一個制表符。 我已經嘗試過這樣做,獲得任何結果的唯一成功方法是在搜索詞之間放置一個選項卡。 因此,如果我要查找項目1239 id,請在cmd行中鍵入以下內容:

Enter item to find:<tab>1239<tab>

然后它將進行搜索,並顯示其中包含該項目的帳戶。 但是,我仍然必須單獨打開帳戶以查明該物品的數量。 如果希望找到值,我希望搜索結果顯示項目的數量。 但是,如果值是一個數量,並且它試圖搜索一個選項卡,我希望它跳過它或說零。

這就是我的意思。

character-equip = 0    1024    1239

Enter item to find: 1239

如果點擊了該帳戶,那么我想使搜索結果顯示為零(如果它不能跳頁或查看空白處的任何值)。 因此它將顯示為空或零。帳戶Falcon3.txt具有空值!

要么

Account Falcon3.txt has 0!

我曾嘗試這樣做,但不確定如何實現。

這是我的代碼。

import java.io.*;
import java.util.*;

public class ItemDatabase {

    public static void main(String args[]) {

        System.out.print("Enter item to find: ");
        Scanner sc = new Scanner(System.in);
        find(sc.nextLine());
    }

    public static void find(String delim) {
        File dir = new File("accounts");
        if (dir.exists()) {
            String read;
            try {
                File files[] = dir.listFiles();
                for (int i = 0; i < files.length; i++) {
                    File loaded = files[i];
                    if (loaded.getName().endsWith(".txt")) {
                        BufferedReader in = new BufferedReader(new FileReader(loaded));
                        StringBuffer load = new StringBuffer();
                        while ((read = in.readLine()) != null) {
                            load.append(read + "\n");
                        }
                        String delimiter[] = new String(load).split(delim);

                        if(delimiter.length > 1) {
                        System.out.println("Account " + loaded.getName() + "has " + delimiter[1] + "!");
                        }
                    }
                }  
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("error: dir wasn't found!");
        }
    }
}

謝謝大家,希望您能對我有所幫助。

這只是在呼喚數據庫。 如果整個后端都在單個Java進程中運行,則建議使用Apache DerbyH2之類的東西。

如果您不想遷移到數據庫,而主要問題是在一個目錄中列出所有條目的行為,是否可以將其拆分為一個層次結構。 然后,您的Falcon帳戶可以位於F / FA / Falcon.txt中-每個目錄將包含更多可管理的文件。

除了需要數據庫外,您還可以使用命令行實用程序(例如find,grep等)或文本處理語言(例如perl)來更直觀,更輕松地實施解決方案。

也許

grep '[0-9]+\t[0-9]+\t1239' Account_Falcon3.txt

會回來

character-equip = 0    1024    1239

然后,您可以輕松地看到該項目的值為0。

我不能強調不夠,需要寫Java程序來做到這一點-你不會做的好工作作為標准shell實用程序的作者。 面對現實,您問的這個事實表明您是新手! :)(根據主題,我們都是新手)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM