按彼此之间的距离对感兴趣的点进行排序

olhwl3o2  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(263)

我有一个以点对象作为输入的数组。我想对这些点进行排序,得到一个包含所有点的最短路径的数组。这是到目前为止我的代码,但我还没有弄清楚,一旦点被使用,如何删除它们。

public Point[] poiSort(Point[] poi){
        poi = new Point[lenght+1];
        poi[0] = points[0];
        distances = new Double[lenght];
        double Distance = verybignumber;
        double Distancecompare;
        for (int i = 1; i < leght+1; i++){
            for (int j = 1; j < (lenght); j++){
                Distancecompare = points[i-1].getDistance(points[j]);
                if (Distance > Distancecompare){
                    Distance = Distancecompare;
                    poi[i] = points[j];
                    distances[i-1] = Disstance;
                }
            }
        }
        return poi;
    }
mwkjh3gx

mwkjh3gx1#

您可以在排序期间构建一个新数组,并将其作为结果返回。这样您就不需要删除元素。或者,您可以使用arraylist或treeset以获得更大的灵活性。这里有一个可能不是很优雅,但可以使用阵列的示例:

import java.util.Arrays;
import java.util.Comparator;
import java.util.Optional;

public class Main {

    public static void main(String... args) {

        Point[] points = {new Point(1,1), new Point(3,3), new Point(2,2)};
        Point[] result = sort(points);
        for (Point p : result) {
            System.out.println("point(" + p.x + ", " + p.y + ")");
        }

    }

    public static Point[] sort(Point[] in) {
        if (in == null || in.length == 0) {
            return in;
        }
        Point[] out = new Point[in.length];
        Point current = in[0];
        for (int i = 0; i < in.length; i++) {
            if (i == in.length -1) {
                out[in.length -1] = Arrays.stream(in).filter(p -> !p.visited).findAny().orElseGet(null);
                break;
            }
            final Point finalCurrent = current;     // variable must be final or effectively final as used in stream
            out[i] = finalCurrent;
            finalCurrent.visit();
            Point next = Arrays.stream(in).filter(p -> !p.visited).min(Comparator.comparingDouble(p -> p.getDistance(finalCurrent))).get();
            current = next;
        }
        return out;
    }
}

class Point {
    final double x;
    final double y;
    boolean visited;

    Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getDistance(Point point) {
        return Math.abs(this.x-point.x) + Math.abs(this.y - point.y);
    }

    public void visit() {
        visited = true;
    }

}
3mpgtkmj

3mpgtkmj2#

你显然想解决的问题毫无意义。
或者至少。。。子问题没有。
如果你有 N 点,则它们之间的成对距离数为 (N-1)^2 . 对于每个给定点p,有 N - 1 到其他点的距离。不能基于此为点定义相关/易于计算的顺序。所以排序没有意义。
你可以做的是取一个点,然后根据到该点的距离对其他点排序。但这意味着,对于总共n个点,您有n个单独的订单。
请注意,您在这里试图解决的是一种形式的“旅行推销员1问题”(tsp)。tsp在数学上被证明是np完全的。这应该告诉您,尝试通过排序来解决它(这是 O(NlogN) )不工作。
我的建议是:
读一些关于tsp的书,以及为什么它很难
尽量避免找到问题的精确解决方案
看看寻找近似解的技术/算法。。。而不是试图发明自己的算法。
查找现有的库。
1-或“旅行推销员问题”。不,我不是开玩笑。

相关问题