Сортировка коллекции на основе сходства - PullRequest
0 голосов
/ 05 ноября 2018

Я рассчитал матрицу, содержащую логические значения между людьми, указывающие, имеют ли они определенное свойство. Я хотел бы упорядочить строки (и использовать этот порядок для упорядочения столбцов) этой матрицы на основе сходства между людьми. Таким образом, несколько человек, которые показывают похожий «профиль обмена», должны быть заказаны вместе. Например, свойства между 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 голосов
/ 05 ноября 2018

Вы не можете «сортировать» здесь: на самом деле вы группируете .

Предполагая, что у вас есть метод, который возвращает свойство, по которому они должны быть сгруппированы, вы можете сгруппировать элементы вместе в карту, указанную этим свойством:

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...