对arraylist的removeAll操作使程序挂起

时间:2013-06-03 08:26:23

标签: java arraylist removeall

我正在尝试从两个文件读入并将它们存储在两个单独的arraylists中。这些文件包含单独在一行上的单词或由逗号分隔的行上的多个单词。 我用以下代码(不完整)读取每个文件:

ArrayList<String> temp = new ArrayList<>();

FileInputStream fis;
fis = new FileInputStream(fileName);

Scanner scan = new Scanner(fis);

while (scan.hasNextLine()) {
    Scanner input = new Scanner(scan.nextLine());
    input.useDelimiter(",");
    while (scan.hasNext()) {
        String md5 = scan.next();
        temp.add(md5);
    }
}
scan.close();    

return temp;

每个文件包含近100万个单词(我不知道确切的数字),所以我不完全确定上面的代码是否正常工作 - 但似乎是这样。

我现在想知道第一个文件/ arraylist有多少单词是独占的。为此,我计划使用list1.removeAll(list2),然后检查list1的大小 - 但由于某种原因,这不起作用。代码:

public static ArrayList differentWords(String fileName1, String fileName2) {
    ArrayList<String> file1 = readFile(fileName1);
    ArrayList<String> file2 = readFile(fileName2);

    file1.removeAll(file2);

    return file1;
}

我的主要方法包含一些不同的调用,一切正常,直到我到达上面的代码,这只会导致程序挂起(在netbeans中它只是“正在运行”)。
知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

您未在

中使用input
while (scan.hasNextLine()) {
  Scanner input = new Scanner(scan.nextLine());
  input.useDelimiter(",");
  while (scan.hasNext()) {
    String md5 = scan.next();
    temp.add(md5);
  }
}

我认为你打算这样做:

while (scan.hasNextLine()) {
  Scanner input = new Scanner(scan.nextLine());
  input.useDelimiter(",");
  while (input.hasNext()) {
    String md5 = input.next();
    temp.add(md5);
  }
}

但是那说你应该调查String#split(),这可能会节省你一些时间:

while (scan.hasNextLine()) {
  String line = scan.nextLine();
  String[] tokens = line.split(",");
  for (String token: tokens) {
    temp.add(token);
  }
}

答案 1 :(得分:-1)

试试这个:

for(String s1 : file1){
    for(String s2 : file2){
        if(s1.equals(s2)){file1.remove(s1))}
    }
}