我有一个对象类
class Device{
String name;
String type;
String status;
}
我有 2 个列表 第一个就像{d1,m1,active}, {d2,m2,active},{d3,m3,acticve}
第二个{d2,m2,paused},{d4,m4,paused}
我希望我的最终名单像 {d1,m1,active},{d2,m2,paused},{d3,m3,active},{d4,m4,paused}
我的方法是制作一个 commonName 列表,{d2}
然后将列表添加{d1,d2,d2,d3,d4}
到总列表中,然后遍历总列表,如果 common deviceName( d2.contains(i.getName())
) 匹配,则删除状态为活动的那个(删除我的意思是制作另一个列表和不要添加“活动”对象)。
除了在迭代中使用 contains 之外,是否还有一种有效的方法来执行此操作。将复杂度降低到 o(N)。
假设第一个列表中的设备具有唯一名称,您可以在两个列表中流式传输并收集以映射合并,只要在第二个列表中找到相同的名称并选择具有paused
作为状态的名称。使用以下类作为示例的示例:
@ToString
@AllArgsConstructor
@Getter
static class Divice {
private String name;
private String type;
private String status;
}
和以下示例列表
List<Divice> list1 = new ArrayList<>();
list1.add(new Divice("d1", "m1", "active"));
list1.add(new Divice("d2", "m2", "active"));
list1.add(new Divice("d3", "m3", "active"));
List<Divice> list2 = new ArrayList<>();
list2.add(new Divice("d2", "m2", "paused"));
list2.add(new Divice("d4", "m4", "paused"));
然后做 :
List<Divice> merged = new ArrayList<>(
Stream.concat(list1.stream(),list2.stream())
.collect(Collectors.toMap(Divice::getName,
Function.identity(),
(i,j) -> "paused".equals(i.getStatus()) ? i : j,
LinkedHashMap::new)).values()
);
merged.forEach(System.out::println);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句