Генерация строковых комбинаций из строковых массивов, хранящихся в HashMap - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть хава Java, структура выглядит так:

HashMap<Integer, ArrayList<String>> finalMap = new HashMap<Integer, ArrayList<String>>();

finalMap.toString() это нечто вроде этого

{0=[a1, a2, a3, a4], 1=[b1, b2, b3], 2=[c1, c2], 3=[d1]}

Мне нужно сгенерировать все комбинации следующим образом:

1. a1 b1 c1 d1
2. a1 b1 c2 d1
3. a1 b2 c1 d1
4. a1 b2 c2 d1
5. a1 b3 c1 d1
6. a1 b3 c2 d1
...
...
...
...
...

Заранее спасибо.

1 Ответ

1 голос
/ 16 ноября 2011

Просто перебор всех элементов и пропуск дубликатов (выполняется автоматически HashSet). Существуют лучшие способы объединения строк, но для простоты:

HashSet<String> result = new HashSet<String>();

for (String a : finalMap.get(0)) {
    for (String b : finalMap.get(1)) {
        for (String c : finalMap.get(2)) {
            for (String d : finalMap.get(3)) {
                result.add(a + b + c + d);
            }
        }
    }
}
System.out.println(result);  

Вывод должен быть как
[a3b2c1d1, a1b3c1d1, a1b1c1d1, a1b2c2d1, a4b1c2d1, a4b3c2d1, a1b2c1d1, a2b1c2d1, a2b2c2d1, a3b3c2d1, a1b1c2d1, a1b3c2d1, a2b3c2d1, a3b3c1d1, a2b2c1d1, a4b1c1d1, a4b3c1d1, a4b2c1d1, a3b1c2d1, a2b3c1d1, a3b1c1d1, a4b2c2d1, a2b1c1d1, a3b2c2d1]

Однако, если вы еще не знаете общее количество списков или они могут отличаться, вы можете использовать рекурсивный подход

void generate(HashSet<String> resultList, String resultString,
        int listNum, HashMap<Integer, ArrayList<String>> data) {
    if (listNum == 0) {
        // start: begin a new resultString
        for (int i = 0; i < data.get(listNum).size(); i++) {
            generate(resultList, data.get(listNum).get(i), listNum + 1,
                    data);
        }
    } else if (listNum == data.size() - 1) {
        // end: store completed resultStrings
        for (int i = 0; i < data.get(listNum).size(); i++) {
            resultList.add(resultString + data.get(listNum).get(i));
        }
    } else {
        // middlepart: append current string to given resultString
        for (int i = 0; i < data.get(listNum).size(); i++) {
            generate(resultList, resultString + data.get(listNum).get(i),
                    listNum + 1, data);
        }
    }
}  

называется следующим образом:

HashSet<String> result = new HashSet<String>();
generate(result2, null, 0, finalMap);
System.out.println(result);  

Вывод также должен быть как
[a3b2c1d1, a1b3c1d1, a1b1c1d1, a1b2c2d1, a4b1c2d1, a4b3c2d1, a1b2c1d1, a2b1c2d1, a2b2c2d1, a3b3c2d1, a1b1c2d1, a1b3c2d1, a2b3c2d1, a3b3c1d1, a2b2c1d1, a4b1c1d1, a4b3c1d1, a4b2c1d1, a3b1c2d1, a2b3c1d1, a3b1c1d1, a4b2c2d1, a2b1c1d1, a3b2c2d1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...