Вопрос-ответ

Intersection and union of ArrayLists in Java

Пересечение и объединение списков массивов в Java

Существуют ли какие-либо методы для этого? Я искал, но не смог найти ни одного.

Еще один вопрос: мне нужны эти методы, чтобы я мог фильтровать файлы. Некоторые из них являются AND фильтрами, а некоторые - OR фильтрами (например, в теории множеств), поэтому мне нужно фильтровать по всем файлам и объединять / пересекать списки массивов, которые содержат эти файлы.

Должен ли я использовать другую структуру данных для хранения файлов? Есть ли что-нибудь еще, что могло бы обеспечить лучшее время выполнения?

Переведено автоматически
Ответ 1

Вот простая реализация без использования какой-либо сторонней библиотеки. Главное преимущество перед retainAll, removeAll и addAll в том, что эти методы не изменяют исходные списки, вводимые методами.

public class Test {

public static void main(String... args) throws Exception {

List<String> list1 = new ArrayList<String>(Arrays.asList("A", "B", "C"));
List<String> list2 = new ArrayList<String>(Arrays.asList("B", "C", "D", "E", "F"));

System.out.println(new Test().intersection(list1, list2));
System.out.println(new Test().union(list1, list2));
}

public <T> List<T> union(List<T> list1, List<T> list2) {
Set<T> set = new HashSet<T>();

set.addAll(list1);
set.addAll(list2);

return new ArrayList<T>(set);
}

public <T> List<T> intersection(List<T> list1, List<T> list2) {
List<T> list = new ArrayList<T>();

for (T t : list1) {
if(list2.contains(t)) {
list.add(t);
}
}

return list;
}
}
Ответ 2

Коллекция (так что ArrayList также) имеет:

col.retainAll(otherCol) // for intersection
col.addAll(otherCol) // for union

Используйте реализацию List, если вы допускаете повторения, реализацию Set, если вы этого не делаете:

Collection<String> col1 = new ArrayList<String>(); // {a, b, c}
// Collection<String> col1 = new TreeSet<String>();
col1.add("a");
col1.add("b");
col1.add("c");

Collection<String> col2 = new ArrayList<String>(); // {b, c, d, e}
// Collection<String> col2 = new TreeSet<String>();
col2.add("b");
col2.add("c");
col2.add("d");
col2.add("e");

col1.addAll(col2);
System.out.println(col1);
//output for ArrayList: [a, b, c, b, c, d, e]
//output for TreeSet: [a, b, c, d, e]
Ответ 3

Этот пост довольно старый, но, тем не менее, он был первым, который появился в Google при поиске этой темы.

Я хочу предоставить обновление, используя потоки Java 8, делающие (в основном) то же самое в одной строке:

List<T> intersect = list1.stream()
.filter(list2::contains)
.collect(Collectors.toList());

List<T> union = Stream.concat(list1.stream(), list2.stream())
.distinct()
.collect(Collectors.toList());

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

Ответ 4
list1.retainAll(list2) - is intersection

объединение будет removeAll а затем addAll.

Подробнее смотрите в документации collection (ArrayList - это коллекция) http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html

java list