繁体   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