Подтвердить что ты не робот

Удалите все объекты в arraylist, которые существуют в другом 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;

Теперь мне нужно прочитать два файла и удалить все слова из первого файла, которые также существуют во втором файле (в файлах есть несколько повторяющихся слов). Я пробовал использовать for-loops и другие подобные вещи, но ничего не сработало, поэтому любая помощь будет принята с благодарностью!

Бонусный вопрос: мне также нужно выяснить, сколько дубликатов есть в двух файлах - я сделал это, добавив оба arraylists в HashSet, а затем вычитал размер набора из объединенного размера двух arraylists - Это хорошее решение, или это можно сделать лучше?

4b9b3361

Ответ 1

Вы можете использовать метод removeAll для удаления элементов из одного списка из другого списка.

Чтобы получить дубликаты, вы можете использовать метод retainAll, хотя ваш подход к набору также хорош (и, вероятно, более эффективен)

Ответ 2

Средство сбора данных имеет удобный способ для этой цели:

list1.removeAll(list2);

Ответ 3

Как уже упоминалось, используйте метод Collection.removeAll, если вы хотите удалить все элементы, которые существуют в одной коллекции из коллекции, которую вы вызываете removeall on.

Что касается вашего бонусного вопроса, я большой поклонник класса Guava Sets. Я бы предложил использовать Sets.intersection следующим образом:

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

Предполагая, что вы создали набор слов из обоих файлов, вы можете определить, сколько разных слов они имеют вместе с этим одним лайнером.

Ответ 4

Сначала вам нужно переопределить одинаковый метод в своем пользовательском классе и определить критерии соответствия для удаления списка

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(песни2);