借鉴java 开发之商品规格属性(SKU)组合算法_Runt02的博客-CSDN博客_java 商品属性
public List<LinkedHashMap<String, String>> specesPlanNumeration(LinkedList<LinkedHashMap<String, String[]>> namelist){
//创建存放有序map集合
List<LinkedHashMap<String, String>> mapList=new LinkedList<>();
//判断传入参数是否为空
if( namelist.size()==0){
return mapList;
}
//1.便利传入参数
namelist.get(0);
LinkedHashMap<String, String[]> stringLinkedHashMap = namelist.get(0);
stringLinkedHashMap.forEach((key,value)->{
for (String s : value) {
LinkedHashMap<String, String>mapo = new LinkedHashMap<>(16, 0.75f, true);
mapo.put(key,s);
//创建有序map
LinkedHashMap<String, String>map = new LinkedHashMap<>(16, 0.75f, true);
//创建下级集合
LinkedList<LinkedHashMap<String, String[]>> lists=new LinkedList<>();
//除去下标0的数据,其他存入下级集合
for (int i1 = 1; i1 < namelist.size(); i1++) {
lists.add(namelist.get(i1));
}
addxxx(mapList, map,mapo,lists);
}
});
return mapList;
}
此处用LinkedMap,我是为了防止map的无须造成重复插入,后来一看想多了。但还是用在这里了。
private void addxxx(List<LinkedHashMap<String, String>> mapList, LinkedHashMap<String, String> map, LinkedHashMap<String, String> mapo, LinkedList<LinkedHashMap<String, String[]>> lists) {
if(lists.size() == 0 || lists.get(0).size() == 0){
map.putAll(mapo);
mapList.add(map);
}else{
map.putAll(mapo);
LinkedHashMap<String, String[]> stringLinkedHashMap = lists.get(0);
stringLinkedHashMap.forEach((key,value)->{
for (String s : value) {
LinkedHashMap<String, String>mapx = new LinkedHashMap<>(16, 0.75f, true);
mapx.put(key,s);
LinkedList<LinkedHashMap<String, String[]>> listx=new LinkedList<>();
for (int i = 1; i < lists.size(); i++) {
listx.add(lists.get(i));
}
LinkedHashMap<String, String> mapobj=new LinkedHashMap<>();
mapobj.putAll(map);
addxxx(mapList,mapobj,mapx,listx);
}
});
}
}
测试代码:数据库中商品规格我存的是JSON类型的字段,映射到DAO是String
/**
* 商品规格拆分测试
* @param args
*/
public static void main(String[] args) {
String attributeList = "[{\"id\":\"4152cfe0-6ecd-11ec-b8b3-853d52bc4840\",\"name\":\"kkk\",\"item\":[\"1\",\"2\",\"3\"],\"input\":false,\"attr\":\"3\"},{\"id\":\"46fba250-6ecd-11ec-b8b3-853d52bc4840\",\"name\":\"vvv\",\"item\":[\"a\",\"b\",\"c\"],\"input\":false,\"attr\":\"c\"}]";
JSONArray jsonArray = JSONArray.parseArray(attributeList);
LinkedList<LinkedHashMap<String, String[]>> namelist = new LinkedList<>();
LinkedList<List<String>> sd = new LinkedList<>();
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
LinkedHashMap<String, String[]> cc = new LinkedHashMap<>(16, 0.75f, true);
String name = (String) object.get("name");
String item = object.get("item").toString();
String[] strings = toArray(item);
List<String> templatesList = JSON.parseArray(item, String.class);
sd.add(templatesList);
cc.put(name, strings);
namelist.add(cc);
}
List<LinkedHashMap<String, String>> linkedHashMaps = new SpecAlgorithm<String>().specesPlanNumeration(namelist);
for (LinkedHashMap<String, String> linkedHashMap : linkedHashMaps) {
AtomicInteger a= new AtomicInteger(1);
linkedHashMap.forEach((key,value)->{
System.out.println(a.getAndIncrement()+1);
System.out.println(key+"---------"+value);
});
}
}
运行得出9种组合:现在为MAP 转换成json即可
kkk---------1
vvv---------a
kkk---------1
vvv---------b
kkk---------1
vvv---------c
---------------------------
kkk---------2
vvv---------a
kkk---------2
vvv---------b
kkk---------2
vvv---------c
----------------------------
kkk---------3
vvv---------a
kkk---------3
vvv---------b
kkk---------3
vvv---------c
感谢上文链接的老哥文章帮助
写的不好,希望其中某处也能帮助到各位屁股