java - 我该如何改进这个映射算法

标签 java algorithm mapping

我有一个包含 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/

相关文章:

java - 解决仅出现在一个编译器中的不匹配异常

java - 我在第 3 行第 22 列收到此错误 "Error code 30000, SQL state 42X01: Syntax error: Encountered "AUTO_INCREMENT。

algorithm - 高阶矩阵乘法

mapping - 如何使用 MapStruct 1.2 有条件地映射属性?

java - Java 中的多对一映射

indexing - 创建索引时在Analyzer中出现错误

java - 显示数组时如何使用 DecimalFormat?

java - 什么是 C# 等同于 Java 的 ClassName.class.getSimpleName()

algorithm - 在掷骰子算法方面需要一些帮助

algorithm - Dijkstra 斐波那契堆解决方案中的大 O