我有一个包含 n
个项目的列表,每个项目都有一个产品代码和 m
个人(可能位于其中几个项目中)。
类似这样的事情:
items: [
{ code: 'Tuna', people: [ 'Adam', 'Eric' ] },
{ code: 'Corn', people: [ 'Eric' ] },
...
]
我想将其映射到不同的人及其拥有的产品的列表,或者类似这样的内容:
people: {
Adam: ['Tuna'],
Eric: ['Tuna', 'Corn']
}
在过去的两个小时里,我一直在努力想出一个优雅的解决方案来实现一个非常简单的映射算法。
我在 Java 8 中执行此操作,因此流 API 可供使用。顺序并不重要。
这是我目前的最大努力:
Map<Person, List<String>> partyProductMap = getItems().stream()
.flatMap(item -> item.getPeople().stream())
.distinct()
.collect(Collectors.toMap(
Function.identity(),
person -> getItems().stream()
.filter(item -> item.getPeople().contains(person))
.map(item -> item.getProductCode())
.distinct()
.collect(Collectors.toList())
));
很想听听一些关于如何改进这一点的想法!
最佳答案
我的观点是,最优雅的解决方案就是简单的解决方案:
final Map<Person, Set<String>> partyProductMap = new HashMap<>();
for (final Item item : getItems())
for (final Person person : item.getPeople()) {
Set<String> codes = partyProductMap.get(person);
if (codes == null) partyProductMap.put(person, codes = new HashSet<>());
codes.add(item.code);
}
注意:这里使用的是Set而不是List
当然,像 Item/Person 这样的类有 hashCode、equals 和可能的 CompareTo 的正确实现
关于java - 我该如何改进这个映射算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37442175/