2012-07-09 3 views
0

두 개의 자바 List<String> 개체가 있고 세 번째 List<String> 결과 개체에 처음 두 개체의 모든 가능한 조합을 추가해야합니다. 마찬가지로 : Java, List에 중첩 된 반복자를 올바르게 구현하는 방법은 무엇입니까?

long combinations = list1.size() * list2.size()

어쩌면 내가 잘못하고있어, 더 나은 방법이 거기에있다 :

List<String> list1 = getList1(); 
List<String> list2 = getList2(); 

List<String> result = new ArrayList<String>(); 

for(String value1 : list1) { 
    for(String value2 : list2) { 
     result.add(value1 + value2); 
    } 
} 

문제는이 신속하고 더러운 기능은 기하 급수적으로 목록이 자랄 때 느려지이다 또는 사용할 수있는 프레임 워크는 무엇입니까?

+1

목록에 중복이 많으면 더 잘 수행 할 수 있습니다. 각'List'의 모든 요소를'Set'에 삽입하고 같은 코드를 반복하면됩니다. 이 방법은 중복이 일반적이지 않은 경우 현재 방법보다 약간 나을 것입니다. 모든 조합을 찾으려면 최소한 고유 조합의 수만큼의 시간 복잡성을 지출해야합니다. – nhahtdh

+0

이 시나리오에는 중복이 없습니다. – Mark

+0

이 방법이 가장 직설적이라고 생각합니다. 2 목록에 중복이 없으면 수행 할 수있는 유일한 작업은 동일한 조합을 다시 계산하지 않는 것입니다. 그러나 어쨌든 그렇게 할 생각은 없습니다. – nhahtdh

답변

0

는 결과에 대한 초기 용량을 제공 할 수 있습니다, 더 빨리 만들려면 unmodifiable AbstractCollection (or AbstractList) 및 관련 반복자 (필요한 경우 두 개의 반복자를 반복합니다). 이렇게하면 결합 된 목록에 O (N * M) 저장 장치가 필요하지 않습니다.

+0

성능이 약간 향상되었지만 아무 것도 개선되지 않았습니다. – Mark

0

size를 함께 곱하는 대신 result.size()를 호출하여 원하는 것을 얻을 수 있습니까?

int capacity = list1.size() * list2.size(); 
List<String> result = new ArrayList<String>(capacity); 
0

경미 - 열심히 -하지만-확실히-더 좋은 방법은 확장 할 수있다 : ArrayList의 내부 배열이 확장되지 않도록

관련 문제