Предположим, что мы даем список списков некоторых предметов, например строк.Самый эффективный способ комбинирования элементов списков элементов в наборах комбинаций?
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 дешево, обычно меньше инструкций процессора, чем malloc в C (источник: 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);
}
}
Итак, как бы вы это сделали?
Редактировать: Чтобы быть ясным, я не хочу создавать перестановки. Я хочу создать множество больших размеров (список списков).
Ну, вы можете просто сделать это в цикле ... (нет необходимости в рекурсии). –
ли списки содержат одинаковое количество элементов? – user1329572
Вы хотите сохранить все наборы в памяти? Или вы ищете конкретную комбинацию или свойство в результирующих наборах? – Erica