package com.thinkgem.jeesite.test;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class PermutationsTest {
public static void main(String[] args) {
System.out.println(getSize(4));
System.out.println(getDeduplicationList(Lists.newArrayList("A", "B", "D", "D")));
System.out.println(getList(Lists.newArrayList("A", "B", "D", "D")));
}
/**
* 去除重复的数据
* @param list
* @return
*/
public static List<List<String>> getDeduplicationList(List<String> list) {
List<List<String>> listLists = getList(list);
Map<String, List<String>> stringListMap = listLists.parallelStream().collect(Collectors.toMap(keys -> {
StringBuffer sb = new StringBuffer();
keys.forEach(key -> {
sb.append(key);
});
return sb.toString();
}, value -> value, (v1, v2) -> v1));
return Lists.newArrayList(stringListMap.values());
}
/**
* 不进行去重,也就是list中每个字符都不相同
*
* @param list
* @return
*/
public static List<List<String>> getList(List<String> list) {
List<List<String>> listLists = Lists.newArrayList();
for (int i = 0; i < list.size(); i++) {
listLists = getSpecies(i + 1, listLists, list.get(i));
}
return listLists;
}
/**
* 实现方式为前一次获取的组合List,取出前一次组合的每一个list信息,新增的值可以插入list索引位置0-len位,
* 其余的值判断索引位置是否小于它占用的位置,小于不用管,大于的话,所有的位置都往后移一位
*
* @param len
* @param listLists
* @param value
* @return
*/
private static List<List<String>> getSpecies(int len, List<List<String>> listLists, String value) {
if (len == 1) {
List<String> listList = Lists.newArrayList(value);
listLists.add(listList);
return listLists;
}
List<List<String>> valueLists = Lists.newArrayList();
for (List<String> listList : listLists) {
for (int i = 0, size = listList.size() + 1; i < size; i++) {
String[] strings = new String[size];
strings[i] = value;
for (int j = 0; j < listList.size(); j++) {
if (j < i) {
strings[j] = listList.get(j);
} else {
strings[j + 1] = listList.get(j);
}
}
valueLists.add(Lists.newArrayList(strings));
}
}
return valueLists;
}
/**
* 获取数量 多一个参数等于在获取前一次list的基础上把单个list提出,
* 当前值可以放在list的索引最大位置+1处,表现公式为:f(n)= n * f(n-1)
*
* @param len
* @return
*/
private static int getSize(int len) {
if (len == 1) {
return 1;
}
return len * getSize(len - 1);
}
}
ABC有多少种排列组合
猜你喜欢
转载自blog.csdn.net/xionglangs/article/details/107953867
今日推荐
周排行