Ответ 1
Вы можете использовать метод removeAll
для удаления элементов из одного списка из другого списка.
Чтобы получить дубликаты, вы можете использовать метод retainAll
, хотя ваш подход к набору также хорош (и, вероятно, более эффективен)
Я пытаюсь читать из двух файлов и хранить их в двух отдельных 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 - Это хорошее решение, или это можно сделать лучше?
Вы можете использовать метод removeAll
для удаления элементов из одного списка из другого списка.
Чтобы получить дубликаты, вы можете использовать метод retainAll
, хотя ваш подход к набору также хорош (и, вероятно, более эффективен)
Средство сбора данных имеет удобный способ для этой цели:
list1.removeAll(list2);
Как уже упоминалось, используйте метод Collection.removeAll
, если вы хотите удалить все элементы, которые существуют в одной коллекции из коллекции, которую вы вызываете removeall
on.
Что касается вашего бонусного вопроса, я большой поклонник класса Guava Sets. Я бы предложил использовать Sets.intersection следующим образом:
Sets.intersection(wordSetFromFile1, wordSetFromFile2).size();
Предполагая, что вы создали набор слов из обоих файлов, вы можете определить, сколько разных слов они имеют вместе с этим одним лайнером.
Сначала вам нужно переопределить одинаковый метод в своем пользовательском классе и определить критерии соответствия для удаления списка
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);