문자열을 예로 들어 List 목록을 제공한다고 가정 해 봅시다.항목 목록의 요소를 조합 집합으로 결합하는 가장 효율적인 방법은 무엇입니까?
list 1: "a", "b", "c"
list 2: "d", "e", "f"
list 3: "1", "2", "3"
results: (a, d, 1), (a, d, 2), ... (c, f, 3)
내가 할 수있는 재귀 적 방법을 썼다
, (실제 사용 사례, 이것은 단지 모의 업입니다 문자열과 같은과 아무 상관이 없습니다) 그러나 나는 행복하지 않다 그것 때문에 던져 얻을 임시 세트를 많이 만듭니다 (예, 객체 생성이 Java에서 저렴하다는 것을 알고 있습니다. 일반적으로 C에서 malloc보다 더 적은 CPU 명령어 (소스 : Java Concurrency in Action, p241), eden GC는 저렴합니다. 유머 나 :).
void combine(List<List<String>> itemLists, List<Set<String>> combinations, Set<String> partial) {
if (itemLists == null || itemLists.isEmpty()) return;
List<String> items = itemLists.get(0);
for (String s : items) {
Set<String> tmpSet = new HashSet<>(partial);
tmpSet.add(s);
if (itemLists.size() == 0) //termination test
combinations.add(tmpSet);
else
combine(itemLists.subList(1, itemLists.size()), combinations, tmpSet);
}
}
그럼 어떻게할까요?
편집 : 명확히 말하면, 나는 순열을 만들고 싶지 않습니다. 나는 sizeof (리스트의리스트)가 큰 세트를 만들고 싶다.
글쎄, 그냥 루프에서 할 수 있습니다 ... (재귀 필요 없음). –
목록에 같은 수의 요소가 있습니까? – user1329572
모든 세트를 메모리에 보관 하시겠습니까? 아니면 결과 집합에서 특정 조합이나 속성을 검색하고 있습니까? – Erica