背景:
现有多种容量机油,且每种机油库存不一定一致,需要找到指定容量机油的组合,
所以有了测试机油组合,以及每种组合对应不同库存组合
测试代码:
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.*;
import java.util.stream.Collectors;
public class Test {
public static void main(String[] args) {
List<Oil> list = new ArrayList<>();
list.add(new Oil(1, 3, 3));
list.add(new Oil(2, 4, 3));
list.add(new Oil(3, 5, 7));
// 所有机油排列组合数据集合
Set<Set<Oil>> comAll = new HashSet<>();
for (int c = 1; c <= list.size(); c++) {
comAll.addAll(combination(list, new ArrayList<>(), c));
}
// 所有机油组合和容量组合
Set<Set<Oil>> all = new HashSet<>();
for (Set<Oil> oils : comAll) {
// 针对于一种组合的库存组合
all.addAll(cntCombination(oils));
}
// 测试简单组合
// cntCombination(new HashSet<>(list));
System.out.println(all);
}
/**
* 油料的排列组合情况
*/
private static Set<Set<Oil>> combination(List<Oil> list, List<Oil> temp, int cnt) {
if (cnt == 1) {
Set<Set<Oil>> sets = new HashSet<>();
for (Oil ele : list) {
Set<Oil> collection = new HashSet<>(temp);
collection.add(ele);
sets.add(collection);
}
return sets;
}
cnt--;
Set<Set<Oil>> result = new HashSet<>();
for (int i = 0; i < list.size(); i++) {
List<Oil> coll = new ArrayList<>(temp);
List<Oil> tempList = new ArrayList<>(list);
coll.add(tempList.remove(i));
result.addAll(combination(tempList, coll, cnt));
}
return result;
}
/**
* 油料组合的容量组合情况
*/
private static Set<Set<Oil>> cntCombination(Set<Oil> ps) {
Set<Set<Oil>> res = new HashSet<>();
res.add(ps);
for (int i = 0; i < ps.size(); i++) {
List<Oil> temp = new ArrayList<>(ps);
Oil p = temp.remove(i);
Set<Set<Oil>> res1 = new HashSet<>(res);
for (int i1 = 1; i1 <= p.getCnt(); i1++) {
int finalI = i1;
res.addAll(res1.stream().map(t -> {
Set<Oil> s = t.stream().filter(u -> !Objects.equals(u.getId(), p.getId())).collect(Collectors.toSet());
s.add(new Oil(p.getId(), p.getVol(), finalI));
return s;
}).collect(Collectors.toList()));
}
}
return res;
}
/**
* 油料类
*/
@Data
@AllArgsConstructor
public static class Oil {
/**
* 油料ID
*/
private Integer id;
/**
* 容量
*/
private int vol;
/**
* 数量
*/
private int cnt;
}
}
网友评论