使用java对两个集合进行分组的高级编写,例如使用流API或其他高级类型?
我有两个列表,一个包含“类别”,另一个包含更多细节,例如:使用java对两个集合进行分组的高级编写,例如使用流API或其他高级类型?,java,java-stream,Java,Java Stream,我有两个列表,一个包含“类别”,另一个包含更多细节,例如: List categoryList=newarraylist(3); 类别列表。添加(“cat”); 类别列表。添加(“狗”); 类别列表。添加(“bull”); 类别列表。添加(“其他”); List detailList=new ArrayList(); 详细清单。添加(“a类”); 详细清单。添加(“b类”); 详细列表。添加(“狗a”); 详细清单。添加(“狗b”); 详细清单。添加(“狗c”); 详细清单。添加(“公牛a”);
List categoryList=newarraylist(3);
类别列表。添加(“cat”);
类别列表。添加(“狗”);
类别列表。添加(“bull”);
类别列表。添加(“其他”);
List detailList=new ArrayList();
详细清单。添加(“a类”);
详细清单。添加(“b类”);
详细列表。添加(“狗a”);
详细清单。添加(“狗b”);
详细清单。添加(“狗c”);
详细清单。添加(“公牛a”);
详细清单。添加(“鸟a”);
详细清单。添加(“鸟类b”);
Map Map=newhashmap();
for(字符串类别:categoryList){
put(category,newarraylist());
}
布尔值isFind=false;
用于(字符串详细信息:详细列表){
isFind=false;
for(字符串类别:categoryList){
if(结构集装箱箱(细节、类别)){
map.get(类别)、add(细节);
isFind=true;
打破
}
}
如果(!isFind){
地图。获取(“其他”)。添加(细节);
}
}
系统输出打印项次(map);
输出为:
{其他=[鸟a,鸟b],猫=[猫a,猫b],狗=[狗a,狗b,狗c],牛=[牛a]}
我使用循环,但我想知道是否有一些先进的方法来做到这一点?谢谢。实现这一点有多种方法
收集器#按分组
和列表#包含
假设您的详细信息
和类别
始终具有相同的结构
Map result=detailList.stream()
.collect(收集器)。分组方式(详细信息->{
字符串类别=detail.substring(0,detail.indexOf(“”));
返回类别列表。包含(类别)?类别:“其他”;
}));
但是,List#contains
在数据量较大时执行poorrely,因为它的时间复杂度为O(n)
。所以我建议去下一个
collector#分组依据
和Set#包含
HashSet categories=新的HashSet(categoryList);
映射结果=detailList.stream()
.collect(收集器)。分组方式(详细信息->{
字符串类别=detail.substring(0,detail.indexOf(“”));
退货类别。包含(类别)?类别:“其他”;
}));
但是,如果您更喜欢循环,而不是使用
流
API,那么您可能希望找到比现有的性能更高的东西
还有,一些更健壮的东西
我注意到您当前的代码有两个问题
- 时间复杂度为
,而假设两个列表都按字母顺序排序,则时间复杂度可能为O(m x n)
O(m+n)
- 您正在使用
来确定String#contains
应属于一个类别还是另一个类别,最终可能会在详细信息
类别中包含cat
catepolls
caterpillar