Java - 将 ArrayList 中的字符串与 .txt 文件中的所有文本进行比较

Posted

技术标签:

【中文标题】Java - 将 ArrayList 中的字符串与 .txt 文件中的所有文本进行比较【英文标题】:Java - comparing string in ArrayList to all text in .txt file 【发布时间】:2011-09-15 19:52:36 【问题描述】:

实际的问题会在后面解决 :),谢谢。

我对 Java 还很陌生(几乎是通过一本 400 页的书)。

我对 API 还不是很熟悉。

这是我读取 .txt 文件并检查是否有任何已收集的数据已存储在 .txt 文件中的最佳方法。如果是这种情况,将从数据集合中删除数据,并添加 .txt 中尚未找到的数据。

一些变量:

public String[] names;
public int[] levels;
public int[] IDs;

public ArrayList<String> line = new ArrayList<String>();
public ArrayList<RSNPC> monsterList = new ArrayList<RSNPC>();
public ArrayList<String> monstersToAdd = new ArrayList<String>();

检查现有.txt文件的方法:

    private void checkForLine() 
     try
         // Create file 
        File file = new File(getCacheDirectory() + "output.txt");
        RandomAccessFile out = new RandomAccessFile(file, "rw");
        for(int i = 0; i < file.length(); i++)
            line.add(out.readLine());
        
        for(String monster : monstersToAdd)    
            if(line.contains(monster))
                monstersToAdd.remove(monster);
            
        
        //Close the output stream
        out.close();
     catch (Exception e)//Catch exception if any
         System.err.println("Error: " + e.getMessage());
         
     

最后保存 checkForLine() 定义的信息(文件中已经没有的信息)的方法:

private void saveToFile() 
     try
         // Create file 
        BufferedWriter out = new BufferedWriter(new FileWriter(getCacheDirectory() + "output.txt"));
        for(String a : monstersToAdd)
            out.write(a);
            out.newLine();
            log("Wrote " + a + "to file");
        
         //Close the output stream
         out.close();
         catch (Exception e)//Catch exception if any
         System.err.println("Error: " + e.getMessage());
         
     

执行顺序:

        getNPCS();
    getNames(monsterList);
    getLevels(monsterList);
    getIDs(monsterList);
    combineInfo();
    checkForLine();
    saveToFile();

问题然而,它没有正确检查 .txt 文件的信息。我可以看到,因为它只是保存它一遍又一遍地观察到的任何东西,而不是整理任何东西。以我有限的知识,这是我能想到的唯一方法,但没有奏效。

对于那些想知道的人:这是一个名为 RSbot 的机器人的脚本,它玩名为 RuneScape 的游戏。我实际上并没有使用机器人,但我想在练习中这样做。

如果可以进一步澄清问题,我可以粘贴整个脚本。

我非常感谢任何帮助,当然会记得选择我使用的答案(如果有人愿意帮忙;))。

谢谢。

【问题讨论】:

“不排序任何东西” - 我在这里看不到任何执行排序的实际代码。 @Matt Ball "filtering" -- 这就是为什么没有 CME ;) 建议在iterface写List&lt;String&gt; x = new ArrayList&lt;String&gt;()而不是ArrayList&lt;String&gt; y = new ArrayList&lt;String&gt;()代码,而不是实现。 :) @pst:我希望 readLine() 实际上只是将它读取的行作为字符串返回,这将匹配怪物,但我可以从你那里得知它没有:/。 .似乎真的找不到任何其他有用的方法atm。 @Mike:会的。 pst 担心行尾字符,但API 非常清楚丢弃它们。您可以随时致电trim 以确保没有多余的空格。 【参考方案1】:
for(String monster : monstersToAdd)    
    if(line.contains(monster))
        monstersToAdd.remove(monster);
    

如果line.contains(monster)true,并且monstersToAdd 包含monster,则会抛出ConcurrentModificationException。 The only safe way to remove an element from a collection while iterating is to use Iterator:

for(Iterator<String> iter = monstersToAdd.iterator(); iter.hasNext();)
    String monster = iter.next();
    if (line.contains(monster)) iter.remove();


编辑

@trutheality指出

实际上,完成同样事情的更简单的方法是monstersToAdd.removeAll(line);

所以你可以用一行代码替换for循环。

【讨论】:

@trutheality 请注意,monstersToAdd 在循环中被迭代,它(可能)在内部被修改。 contains(或line)不相关。 @truth:再看代码。 monster 已从正在迭代的集合中删除。 @pst 哦,出于某种原因,我认为它正在迭代 line 实际上,完成同样事情的更简单的方法是monstersToAdd.removeAll(line); @Mike:只有第一个 @ 通知。您必须单独通知 pst。【参考方案2】:

一个可能的问题是,当您“保存”时,您似乎正在覆盖同一个文件。我建议进行一次测试,从一个文件读取并写入另一个文件。

为了附加到文件,您有几个选项:

    让您的两个函数共享“RandomAccessFile”,这样在第一个函数完成读取文件后,光标位于文件末尾,第二个函数可以从那里继续写入,附加到文件 在第二个函数中打开RandomAccessFile,然后在写入之前将光标移动到文件末尾(例如,通过读取其中的所有内容直到没有更多行)。

【讨论】:

以上是关于Java - 将 ArrayList 中的字符串与 .txt 文件中的所有文本进行比较的主要内容,如果未能解决你的问题,请参考以下文章

Java - 删除 ArrayList 中的重复项

ArrayList.toArray() 中的 Java 泛型

Java-集合框架与数组的实际应用-组装Json字符串

将字符串的ArrayList对齐(自定义)Box将无法进入正确的位置

根据字符串数组顺序对 ArrayList 重新排序 - Java

将 Java 文件中的 ArrayList 值映射到 JSP 文件中的 HTML 对象