gpt4 book ai didi

java - Java 8 流重复数据删除

转载 作者:行者123 更新时间:2023-12-02 12:01:58 26 4
gpt4 key购买 nike

这里是 Java 8。我有一个方法 checkDupeKeys ,它将采用三个不同的 SortedMap 实例作为其参数,并且需要验证没有两个 SortedMap 实例具有相同的键。迄今为止我最好的尝试:

private void checkDupeKeys(SortedMap<String, Fizz> fizzes, SortedMap<String, Buzz> buzzes,
SortedMap<String, Foobar> foobars) {}
List<String> keyNames = new ArrayList<>();

keyNames.addAll(fizzes.keySet().stream().collect(Collectors.toList()));
keyNames.addAll(buzzes.keySet().stream().collect(Collectors.toList()));
keyNames.addAll(foobars.keySet().stream().collect(Collectors.toList()));

if(keyNames.size() > keyNames.stream().collect(Collectors.toSet()).size()) {
throw new IllegalArgumentException("Duplicate key names are not allowed.");
}
}

相信这是有效的,但是很可能有更好的方法来实现它(效率等)。

我主要担心的是这个方法不允许我识别哪些键名是重复的。理想情况下,我希望异常消息是:

Duplicate key names are not allowed. You have the following duplicate key names: (1) fizzes["derp"] and buzzes["derp"]. (2) fizzes["flim"] and foobars["flim"]. (3) buzzes["flam"] and foobars["flam"].

如何修改我的(非静态)checkDupeKeys 方法以引发满足此条件的异常?也就是说,我如何访问流中的哪些键是彼此重复的。我确信我可以使用较旧的 Java 集合 API 以困难的方式来完成此任务,但在此解决方案中,效率和利用 Java 8 API 对我来说非常重要。

最佳答案

Java 8 的函数式习惯用处不大,我会简单地使用 Set#retainAll每次比较(总共 3 个)。

请参阅下面的代码草案:

private void checkDupeKeys(SortedMap<String, Fizz> fizzes, 
SortedMap<String, Buzz> buzzes,
SortedMap<String, Foobar> foobars) {

// copies the key set
Set<String> fizBuzSet = new HashSet<>(fizzes.keySet());

// this removes all elements of the set that aren't present in the given key set
fizBuzSet.retainAll(buzzes.keySet());

// aggregating dupes if needed
Map<String, Collection<String>> dupes = new HashMap<>();
// flag to throw exception if needed
boolean areThereDupes = false;

if (!fizBuzSet.isEmpty()) {
areThereDupes = true;
// TODO log fizBuzSet as set of duplicates between fizzes and buzzes
// or...
dupes.put("Fizzes vs Buzzes", fizBuzSet);
}
// TODO repeat with fizzes vs foobars, then again with buzzes vs foobars

// you can either log the dupes separately, or use a Map<String,Collection<String>> where the
// keys represent a compound of the two SortedMaps being compared and the values represent the actual duplicates
// e.g...
if (areThereDupes) {
// TODO throw exception with dupes map representation in message
}

}

关于java - Java 8 流重复数据删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47185373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com