对象列表的组合

Combination of a list of objects

我有一个我无法解决的问题。 希望我能让你明白。

给定以下 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);

Waypoint 对象的新数组

Expected result of the matrix

目标是生成一个包含这些对象的数组

如果实现算法不是任务的一部分,我会推荐像 combinatoricslib3 这样的库,它将为您生成组合。

使用 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]

您可以使用 lib 通过传递您的列表来生成自定义对象的组合,例如将它们收集到列表列表中。下面以一个例子作为起点:

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;
        }
    }
}

您可能需要阅读此 post java-combinations-algorithm 以找到替代方案,例如 Apache CommonsGoogle Guava