java - 根据相似度对集合进行排序

标签 java collections optaplanner

我计算了一个矩阵,其中包含人与人之间的 boolean 值,指示他们是否共享某个属性。我想根据人与人之间的相似性对该矩阵的行进行排序(并使用此排序也对列进行排序)。因此,显示相似“共享配置文件”的多个人应该一起订购。比如6人之间的属性:

 name P1 P2 P3 P4 P5 P6
 P1   x  x
 P2   x  x
 P3         x  x  x    
 P4         x  x  x  
 P5         x  x  x
 P6            x  x  x

在示例中,P1 和 P2 共享属性,因此一起排序。 P3、P4 和 P5 也是如此。请注意,属性不必完全相同。例如,P6 与 P3/P4/P5 最相似,因此它接近该集群。

我试图想出一个特定的 Java 比较器,但它通常适用于返回值 -1 0 和 1,在我的例子中我只有一个相似性分数。不幸的是,它需要使用 Java,因为这是整个项目的主要语言......

有人知道如何根据相似度得分对矩阵进行排序吗?

[编辑] 我添加了 optaplanner 标签,这是我在根据评论搜索问题时发现的。它似乎适用于我的问题,也许了解 optaplanner 的人可以确认它是解决我的问题的相关工具?

最佳答案

你不能在这里真正地“排序”:你实际上在做的是分组

假设你有一些方法返回它们应该被分组的属性,你可以将元素组合到一个映射中,由该属性作为键:

Function<Person, SomeType> groupingFn = ... // SomeType is the type of the property on which to group.
Map<SomeType, List<Person>> = people.stream().collect(groupingBy(groupingFn));

然后您可以将其展平为一个列表,其中的元素组合在一起:

List<Person> grouped =
    people.values().stream()
        .flatMap(Collection::stream)
        .collect(toList());

关于java - 根据相似度对集合进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53153957/

相关文章:

java - 通过 Spring MVC 将对象转换为 REST 服务中的 JSON

java - OptaPlanner - 从另一个规则调用时全局变量为空

java - 如何修复 OptaPlanner 中的构造启发式?

java - 没有像 postId 这样的 fb 我刚刚分享成功

Javafx 网格 Pane ..无法动态添加行..而不收缩

java - 如何以编程方式验证 Java 代码?

c++ - 如何正确编写模板模板参数?

c# - 在 C# 中导航集合的通用列表

python - 如何通过就地过滤来修改 python 集合?

java - OptaPlanner 中 PDPTW 的最便宜插入?