Google 컬렉션 Multiset을 사용하면이 (표현형) 칵테일을 만듭니다 (비록 Eyal's answer도 좋지만). 다른 시간대와 비교해 볼 때 시간/기억력면에서는 효과가 없을 지 모르지만, 그 일은 매우 명확합니다. 목록을 가정
자체 내에 중복 포함하지 :
Multiset<Integer> counter = HashMultiset.create();
int totalLists = 0;
// for each of your ArrayLists
{
counter.addAll(list);
totalLists++;
}
List<Integer> inAll = Lists.newArrayList();
for (Integer candidate : counter.elementSet())
if (counter.count(candidate) == totalLists) inAll.add(candidate);`
목록은 중복 요소를 포함 할 수있는 경우, 먼저 세트를 통해 전달 될 수 있습니다 : 마지막으로
counter.addAll(list) => counter.addAll(Sets.newHashSet(list))
, 이것은 또한 이상적입니다 원하는 경우 나중에 추가 데이터를 원할 수도 있습니다 (예 : 일부 특정 값이 얼마나 잘려나는지).
약간의 Eyal하자 (기본적으로 함께 집합을 통해 목록을 필터링하고 모든 중첩 요소들을 유지하는 단계를 접는) 수정하고 상기보다 경량화 다른 접근법 :
public List<Integer> intersection(Iterable<List<Integer>> lists) {
Iterator<List<Integer>> listsIter = lists.iterator();
if (!listsIter.hasNext()) return Collections.emptyList();
Set<Integer> bag = new HashSet<Integer>(listsIter.next());
while (listsIter.hasNext() && !bag.isEmpty()) {
Iterator<Integer> itemIter = listsIter.next().iterator();
Set<Integer> holder = new HashSet<Integer>(); //perhaps also pre-size it to the bag size
Integer held;
while (itemIter.hasNext() && !bag.isEmpty())
if (bag.remove(held = itemIter.next()))
holder.add(held);
bag = holder;
}
return new ArrayList<Integer>(bag);
}
첫 용액 것 O (n) 시간에 추가 저장 공간없이 작업하십시오. – Rubys
내 직감에 약간의 엄격함을 추가해 주셔서 감사합니다.) – Ankur
두 목록이 [1, 1, 2]이고 [1, 1, 3] 인 경우 출력이 [1, 1] 또는 간단하게 [1]가 되겠습니까? 즉 중복 된 항목을 보유 하시겠습니까? – Adamski