根据相似度对集合排序

时间:2018-11-05 11:56:34

标签: java collections optaplanner

我已经计算出一个矩阵,其中包含人与人之间的布尔值,指示他们是否共享某些属性。我想根据人与人之间的相似性对矩阵的行进行排序(并使用此排序对列进行排序)。因此,应该将显示相似“共享配置文件”的多个人一起订购。例如,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 的人可以确认它是解决我的问题的相关工具?

1 个答案:

答案 0 :(得分:3)

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

假设您有一些方法可以返回将其分组的属性,则可以将元素分组到一个地图中,并以该属性为键:

2302,52

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

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