[英]Outputting permutations of ArrayList using recursion
我正在嘗試排列 ArrayList 中的項目。 我沒有得到正確的 output。 我不知道問題是什么,我相信它在 allPermutations 方法的“else”循環中。 該列表添加所有字符串,直到輸入為-1
。 抱歉,如果這是一個典型的問題,我在詢問之前嘗試查看這里,但無法為自己找到任何幫助。
這是我的代碼:
public static void allPermutations(ArrayList<String> permList,
ArrayList<String> nameList) {
// base case
// nameList is empty after performing all permutations
if (nameList.size() == 0) {
for (int i = 0; i < permList.size(); ++i) {
for (int j = 0; j < permList.size(); ++j) {
System.out.print(permList.get(i) + " ");
}
System.out.println();
}
} else {
for (int i = 0; i < nameList.size(); ++i) {
ArrayList<String> tempPerm = new ArrayList<>(permList);
String name = nameList.get(i);
// remove from nameList and add to new perm
nameList.remove(i);
tempPerm.add(name);
allPermutations(tempPerm, nameList);
}
}
}
輸入是:
Julia Lucas Mia -1
output 應該是:
Julia Lucas Mia
Julia Mia Lucas
Lucas Julia Mia
Lucas Mia Julia
Mia Julia Lucas
Mia Lucas Julia
但我的是:
Julia Julia Julia
Lucas Lucas Lucas
Mia Mia Mia
您可以使用Stream.reduce
方法作為一種遞歸。 此解決方案假定原始數組可能包含重復項,並且如果沒有重復項,它也可以工作。
String[] strings = {"Julia", "Lucas", "Mia"};
IntStream.range(0, strings.length)
// represent a 1d array 'n' as a 2d matrix 'n×n'
.mapToObj(i -> IntStream.range(0, strings.length)
// represent each string as Map<Integer,String>
.mapToObj(j -> Map.of(j, strings[j]))
// Stream<List<Map<Integer,String>>>
.collect(Collectors.toList()))
// intermediate output
.peek(System.out::println)
// reduce a stream of lists to a single list
.reduce((list1, list2) -> list1.stream()
// summation of pairs of maps from two lists
.flatMap(map1 -> list2.stream()
// filter out those keys that are already present
.filter(map2 -> map2.keySet().stream()
.noneMatch(map1::containsKey))
// join entries of two maps
.map(map2 -> {
Map<Integer, String> map = new LinkedHashMap<>();
map.putAll(map1);
map.putAll(map2);
return map;
}))
// collect into a single list
.collect(Collectors.toList()))
// List<Map<Integer,String>>
.orElse(Collections.emptyList())
// final output
.forEach(System.out::println);
中間 output:
[{0=Julia}, {1=Lucas}, {2=Mia}]
[{0=Julia}, {1=Lucas}, {2=Mia}]
[{0=Julia}, {1=Lucas}, {2=Mia}]
最終 output:
{0=Julia, 1=Lucas, 2=Mia}
{0=Julia, 2=Mia, 1=Lucas}
{1=Lucas, 0=Julia, 2=Mia}
{1=Lucas, 2=Mia, 0=Julia}
{2=Mia, 0=Julia, 1=Lucas}
{2=Mia, 1=Lucas, 0=Julia}
另請參閱: Java 中使用遞歸的字符串排列
我正在嘗試排列 ArrayList 中的項目。 我沒有得到正確的 output。 我不知道問題是什么,我相信它在 allPermutations 方法的“else”循環中。 該列表添加所有字符串,直到輸入為-1
。 抱歉,如果這是一個典型的問題,我在詢問之前嘗試查看這里,但無法為自己找到任何幫助。
這是我的代碼:
public static void allPermutations(ArrayList<String> permList, ArrayList<String> nameList) {
// base case
// nameList is empty after performing all permutations
if (nameList.size() == 0) {
for (int i = 0; i < permList.size(); ++i) {
for (int j = 0; j < permList.size(); ++j) {
System.out.print(permList.get(i) + " ");
}
System.out.println();
}
} else {
for (int i = 0; i < nameList.size(); ++i) {
ArrayList<String> tempPerm = new ArrayList<>(permList);
String name = nameList.get(i);
// remove from nameList and add to new perm
nameList.remove(i);
tempPerm.add(name);
allPermutations(tempPerm, nameList);
}
}
}
輸入是:
Julia Lucas Mia -1
output 應該是:
Julia Lucas Mia
Julia Mia Lucas
Lucas Julia Mia
Lucas Mia Julia
Mia Julia Lucas
Mia Lucas Julia
但我的是:
Julia Julia Julia
Lucas Lucas Lucas
Mia Mia Mia
如果您查看排列,這只是另一種選擇,使用庫可能會更好。 Guava 對此Collections2#permutations有一個 function ,您可以在此處查看實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.