Сгенерируйте словосочетания из списка строк в java - PullRequest
1 голос
/ 05 августа 2020

Я хотел создать алгоритм в java, где я могу передать список строк, и он вернет новый список со всеми возможными комбинациями строк, которые он имеет в списке.

Пример:

String[] listWords = new String[] {

                "windows",
                "linux",
                "mac",
                "10",
                "20"

        };

Я хотел бы вызвать метод, передав список, который возвращает все возможные комбинации во всех порядках.

combinations(listWords);

Это результат, который я хотел получить:

windows, linux, ma c, 10,20, windowslinux, linuxwindows, windowsma c, windows10, 10 windows, windows20,20 windows, windowslinuxmac1020, windowsmaclinux20, mac10, mac20,20ma c, 20mac10, windowsma c, ma cwindows ...

Я пробовал это:

public String[][] combinations (String[] ports) {
        List<String[]> combinationList = new ArrayList<String[]>();
        for ( long i = 1; i < Math.pow(2, ports.length); i++ ) {
            List<String> portList = new ArrayList<String>();
            for ( int j = 0; j < ports.length; j++ ) {
                if ( (i & (long) Math.pow(2, j)) > 0 ) {
                    portList.add(ports[j]);
                }
            }
            combinationList.add(portList.toArray(new String[0]));
        }
        return combinationList.toArray(new String[0][0]);
    }

Но это возвращает:

введите описание изображения здесь

Это было не так, как я хотел. Результат должен был быть:

список: [windows, linux, windowslinux, linuxwindows, windows10, 10windowsma clinux .. .]

Можно ли это сделать в java? спасибо кто может помочь :)

1 Ответ

1 голос
/ 05 августа 2020

Если я вас правильно понял, следующее поможет решить проблему.

Вы можете построить результат итеративно, начиная со списка слов, который у вас есть, и на каждой итерации вы добавляете все более длинные слова . Первая итерация дает вам исходный список. Вторая итерация добавляет по одному новому слову к каждому, давая вам перестановки двух слов. Третья итерация добавляет по одному новому слову к каждому из них, давая вам перестановки трех слов и т. Д.

List<String> getWordPermutations(List<String> words) {

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

    for (int i = 1; i < words.size(); i++) {
        List<String> newPermutations = new ArrayList<>();
        for (String previousList : oldPermutations) {
            for (String word : words) {
                if (previousList.contains(word)) {
                    continue;
                }
                newPermutations.add(previousList + word);
            }
        }
        oldPermutations = newPermutations;
        result.addAll(newPermutations);
    }

    return result;
}
...