删除另一个arraylist中存在的arraylist中的所有对象

Geo*_*bby 37 java arraylist

我试图从两个文件读入并将它们存储在两个单独的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;
Run Code Online (Sandbox Code Playgroud)

我现在需要读取两个文件并删除第一个文件中的所有单词,这些单词也存在于第二个文件中(文件中有一些重复的单词).我尝试过for循环和其他类似的东西,但没有任何工作,所以任何帮助将不胜感激!

奖金问题:我还需要找出两个文件中有多少重复项 - 我通过将两个arraylists添加到HashSet然后从两个arraylists的组合大小中减去集合的大小来完成此操作 - 这是一个好的解决方案,还是可以做得更好?

Jon*_*oni 48

您可以使用该removeAll方法从另一个列表中删除一个列表中的项目.

要获得重复项,您可以使用该retainAll方法,尽管您使用该方法的方法也很好(并且可能更有效)


Mor*_*hai 14

收集设施有一个方便的方法:

list1.removeAll(list2);
Run Code Online (Sandbox Code Playgroud)


Sha*_*auf 9

首先,您需要在自定义类中覆盖相等的方法,并定义删除列表的匹配条件

public class CustomClass{

 @Override
    public boolean equals(Object obj) {

        try {
            CustomClass licenceDetail  = (CustomClass) obj;
            return name.equals(licenceDetail.getName());
        }
        catch (Exception e)
        {
            return false;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

其次,您调用removeAll()方法

list1.removeAll(列表2);

  • 提升它,因为它是唯一明确提到equals方法需要在列表中的类中被覆盖的答案.这对某些人来说可能并不明显,如果没有为您的自定义类正确实现equals,removeAll将无法正常工作. (2认同)