У меня есть проблема, которую я не могу решить. Я надеюсь, что смогу заставить вас понять это.
Учитывая следующий список объектов 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
Цель состоит в том, чтобы сгенерировать массив, содержащий эти объекты
@tobias_k Можно, однако я не знаю, как идентифицировать различные типы объектов путевых точек, я мог бы сделать это, сравнив адрес памяти, но я не знаю, лучший ли это способ
Вы хотите реализовать алгоритм самостоятельно или вам подойдет библиотека, которая создает комбинации для вас?
@Eritrean Ладно, библиотека! Без проблем
Зачем нужно сравнивать объекты? Просто создайте три вложенных цикла for и используйте индексы min/max, чтобы гарантировать отсутствие дубликатов. Кроме того, должен ли результат быть точно, как на картинке, то есть (d, b, c) вместо (b, c, d)?




Если реализация алгоритма не является частью задачи, я бы порекомендовал такую библиотеку, как комбинаторика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
Это помогает? stackoverflow.com/q/127704/1639625