使用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