Есть ли метод в стандартном API для обратного retainAll ()? - PullRequest
7 голосов
/ 27 апреля 2011

Есть ли способ, который делает для меня следующее в одном кадре:

List<String> list1 = new ArrayList<String>(Arrays.asList("A","B","C","D"));
List<String> list2 = new ArrayList<String>(Arrays.asList("B","C","E","F"));
List<String> list3 = new ArrayList<String>();
for(String element : list2){
   if(!list1.contains(element))
   list3.add(element);
}

В результате list3 должен содержать элементы "E" и "F".

Ответы [ 2 ]

12 голосов
/ 27 апреля 2011

Вы имеете в виду?

List<String> list3 = new ArrayList<String>(list2);
list3.removeAll(list1);

Однако создание объединений и пересечений обычно лучше всего делать с использованием множеств, а не списков. (И более эффективно)

Set<String> set3 = new LinkedHashSet<String>(set2);
set3.removeAll(set1);
1 голос
/ 27 апреля 2011

Или с гуавой Sets.intersection():

Lists.newArrayList(Sets.intersection(ImmutableSet.of(list1), ImmutableList.of(list2)));
...