使用Java流API在映射中查找重复值
我正试图编写一个程序,在map中查找重复值,这个map是使用list和utity方法创建的 我可以使用for循环获得预期的输出,但是使用该循环的代码太长。 我尝试使用如下所示的java流API,但得到的结果是空的使用Java流API在映射中查找重复值,java,java-stream,Java,Java Stream,我正试图编写一个程序,在map中查找重复值,这个map是使用list和utity方法创建的 我可以使用for循环获得预期的输出,但是使用该循环的代码太长。 我尝试使用如下所示的java流API,但得到的结果是空的 public class PrintListElements { public static void main(String[] args) { List<String> roles = new ArrayList<>();
public class PrintListElements {
public static void main(String[] args) {
List<String> roles = new ArrayList<>();
roles.add("1");
roles.add("2");
roles.add("3");
roles.add("4");
roles.add("5");
roles.add("6");
roles.add("7");
roles.add("1");
HashMap<String, List<String>> idToMap = new HashMap<>();
roles.stream().map(role -> {
if (idToMap.containsKey(role)) {
return idToMap.get(role).add(getName(role));
} else {
return idToMap.put(role, new ArrayList<>(Arrays.asList(getName(role))));
}
})
idToMap.entrySet().forEach(e-> {
if(e.getValue().size()>1) {
System.out.println("found a key which has duplicate value : "+ e.getKey());
}
});
}
public static List<String> getNameLL(String id) {
ArrayList<String> ll = new ArrayList<String>();
ll.add(getName(id));
return ll;
}
public static String getName(String id) {
switch (id) {
case "1":
return "one";
case "2":
return "two";
case "3":
return "third";
case "4":
return "four";
case "5":
return "fifth";
case "6":
return "six";
case "7":
return "seven";
case "8":
return "one";
default:
return "one";
}
}
}
任何人都可以帮助我,要使用Java Stream API获得上述预期的输出结果您可以使用
收集器。groupingBy
按键分组并使用收集器。mapping
映射值并将其收集为每个键的列表
Map<String, List<String>> idToMap =
roles.stream()
.collect(Collectors.groupingBy(e -> e,
Collectors.mapping(e -> getName(e), Collectors.toList())));
可以使用Map
的merge
方法简化
roles.forEach(
role -> idToMap.merge(role, new ArrayList<>(Arrays.asList(getName(role))), (a, b) -> {
a.addAll(b);
return a;
}));
谢谢你的回答!我还可以组合
idToMap.entrySet().forEach(e->{if(e.getValue().size()>1){System.out.println(“找到一个具有重复值的键:+e.getKey());})使用roles.stream().map()
?是的,只需添加链接roles.stream().collect(Collectors.groupingBy(e->e,Collectors.mapping(e->getName(e),Collectors.toList()))).entrySet().forEach(…)
上面提到的代码..工作起来像个符咒@BhavyaGupta你能说出你不懂的部分吗?我将尝试解释一下:)第一个,您使用的是收集器。groupingBy
,但我认为现在更清楚了:)接受您的答案:)角色.stream().map(角色->{…
我想这段代码根本不会执行,你能检查一下Bhavya吗?你的预期输出与你实际想要打印的不同。你真的想映射到映射中的列表
值类型,还是发生频率对你来说足够?
roles.forEach(role -> {
if (idToMap.containsKey(role)) {
idToMap.get(role).add(getName(role));
} else {
idToMap.put(role, new ArrayList<>(Arrays.asList(getName(role))));
}
});
roles.forEach(
role -> idToMap.merge(role, new ArrayList<>(Arrays.asList(getName(role))), (a, b) -> {
a.addAll(b);
return a;
}));
roles.stream()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()))
.entrySet()
.forEach(e -> {
if (e.getValue() > 1) {
System.out.println("found a key which has duplicate value : " + e.getKey());
}
});