52

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

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;

我现在需要读取两个文件并从第一个文件中删除第二个文件中也存在的所有单词(文件中有一些重复的单词)。我已经尝试过 for-loops 和其他类似的东西,但没有任何效果,所以任何帮助将不胜感激!

额外的问题:我还需要找出两个文件中有多少重复项 - 我通过将两个数组列表添加到 HashSet 然后从两个数组列表的组合大小中减去集合的大小来做到这一点 - 这是一个好的解决方案,还是可以做得更好?

4

4 回答 4

60

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

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

于 2013-06-02T23:35:58.053 回答
26

收集设施为此目的提供了一种方便的方法:

list1.removeAll(list2);
于 2013-06-02T23:35:19.173 回答
16

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

public class CustomClass{

 @Override
    public boolean equals(Object obj) {

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

    }
}

其次,您调用 removeAll() 方法

list1.removeAll(list2);

于 2017-08-17T13:20:15.617 回答
4

正如其他人所提到的,Collection.removeAll如果您希望从您正在调用的集合中删除一个集合中存在的所有元素,请使用该方法removeall

至于你的奖金问题,我是 Guava 的Sets课程的忠实粉丝。我建议使用 Sets.intersection 如下:

Sets.intersection(wordSetFromFile1, wordSetFromFile2).size();

假设您从两个文件中创建了一组单词,您可以确定它们与该衬里有多少不同的单词。

于 2013-06-02T23:47:28.427 回答