Комбинация списка объектов

У меня есть проблема, которую я не могу решить. Я надеюсь, что смогу заставить вас понять это.

Учитывая следующий список объектов Waypoint

List<Waypoint>myWaypoint = new ArrayList<Waypoint>();

Я хочу рассчитать комбинации нет повторения групп из 3 (k = 3) элементов в списке и создать матрицу, содержащую только комбинации k-групп

Пример:

List<Waypoint>myWaypoint = new ArrayList<Waypoint>();

Waypoint a = new Waypoint();
Waypoint b = new Waypoint();
Waypoint c = new Waypoint();
Waypoint d = new Waypoint();



myWaypoint.add(a);
myWaypoint.add(b);
myWaypoint.add(c);
myWaypoint.add(d);
  • н!/(р!(н-р)!)

    k = 3 n = 4 -> комбинация: 4

Новый массив объекта Waypoint

Ожидаемый результат матрицы

Цель состоит в том, чтобы сгенерировать массив, содержащий эти объекты

Это помогает? stackoverflow.com/q/127704/1639625

tobias_k 11.05.2022 17:44

@tobias_k Можно, однако я не знаю, как идентифицировать различные типы объектов путевых точек, я мог бы сделать это, сравнив адрес памяти, но я не знаю, лучший ли это способ

Gionata Donati 11.05.2022 17:56

Вы хотите реализовать алгоритм самостоятельно или вам подойдет библиотека, которая создает комбинации для вас?

Eritrean 11.05.2022 18:04

@Eritrean Ладно, библиотека! Без проблем

Gionata Donati 11.05.2022 18:08

Зачем нужно сравнивать объекты? Просто создайте три вложенных цикла for и используйте индексы min/max, чтобы гарантировать отсутствие дубликатов. Кроме того, должен ли результат быть точно, как на картинке, то есть (d, b, c) вместо (b, c, d)?

tobias_k 11.05.2022 18:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если реализация алгоритма не является частью задачи, я бы порекомендовал такую ​​библиотеку, как комбинаторикаlib3, которая сгенерирует для вас комбинации.

Используя combinatoricslib3 простой пример с использованием строк:

Generator.combination("A", "B", "C", "D")
        .simple(3)
        .stream()
        .forEach(System.out::println);

даст вам вывод

[A, B, C]
[A, B, D]
[A, C, D]
[B, C, D]

Вы можете использовать библиотеку для создания комбинаций ваших пользовательских объектов, просто передав свой список и, например, собрав их в список списков. Ниже приведен пример в качестве отправной точки:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import org.paukov.combinatorics3.Generator;

public class Example {

    public static void main(String[] args) {
        List<Waypoint> myWaypoint = new ArrayList<>();
        Waypoint a = new Waypoint("a");
        Waypoint b = new Waypoint("b");
        Waypoint c = new Waypoint("c");
        Waypoint d = new Waypoint("d");
        myWaypoint.add(a);
        myWaypoint.add(b);
        myWaypoint.add(c);
        myWaypoint.add(d);

        List<List<Waypoint>> combinations = Generator.combination(myWaypoint)
                .simple(3)
                .stream()
                .collect(Collectors.toList());

        combinations.forEach(System.out::println);
    }

    static class Waypoint {
        String name;
        public Waypoint(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return name;
        }
    }
}

Возможно, вы захотите прочитать этот пост Java-комбинации-алгоритм, чтобы найти альтернативы, такие как Apache Commons или Google Guava

Другие вопросы по теме