繁体   English   中英

按字典顺序对点数组进行排序

[英]Lexicographically sort an array of points

我正在尝试按字典顺序解决所有整数的NX2数组。 我没有办法实现它。 另外,应尽可能减少时间。 这是例子。

输入项

2 2
1 1
4 3
2 1
10 1

输出量

1 1
2 1
2 2
4 3
10 1
  1. 用两个整数字段实现自己的类Point
  2. 使它实现Comparable (或为此类实现Comparator )。
  3. 填充这些点的数组或列表 ,然后使用相关的排序对它们进行排序:分别为Arrays.sort()Collections.sort()
  4. 迭代结果数组/列表并提取出您的点。

这与排序一堆整数基本上是相同的问题,不同之处在于,不是整数,而是需要排序的一组对象(在这种情况下为元组-或在代码中为两个int数组)。

与Python不同,Java不会自动推断出诸如int []之类的字典顺序,因此您可以将其传递给sort函数,并期望它可以工作。 幸运的是,java允许您定义排序顺序,然后使用内置的sort方法对其进行排序。 这是通过实现Comparator ,然后定义compare方法来告诉它如何比较两个对象来完成的。

下面是一个(非常简化的)示例。

import java.util.*;

class Main{
        public static void main(String args[]){
                int[][] array={{2,2},{1,1},{4,3},{2,1},{10,1}};
                Arrays.sort(array, new Comparator<int[]>(){
                        public int compare(int[] a, int[] b){
                                //assumes array length is 2
                                int x,y;
                                if (a[0]!=b[0]) {
                                        x=a[0];y=b[0];
                                }
                                else{
                                        x=a[1];y=b[1];
                                }
                                if (x<y) return -1;
                                else if (x==y) return 0;
                                else return +1;
                        }
                });
                for(int[] term: array){
                        System.out.println(Arrays.toString(term));
                }
        }
}

在这里,尝试将此Point类与比较器一起使用:

class MyPoint implements Comparable <MyPoint> {
    int x, y;
    public MyPoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int compareTo(MyPoint pt) {
        int cmp = Integer.compare(x, pt.x);
        if (cmp == 0) {
            return Integer.compare(y, pt.y);
        } else {
            return cmp;
        }
    }

}

毕竟,您需要做的是创建一些Point对象并对其进行排序。 这是一个例子:

    ArrayList<MyPoint> pts = new ArrayList<MyPoint>(4);
    pts.add( new MyPoint(3, 5));
    pts.add( new MyPoint(2, 3));
    pts.add( new MyPoint(3, 4));
    pts.add( new MyPoint(1, 5));
    Collections.sort(pts);
    for (int i = 0; i < pts.size(); i++) {
        MyPoint pt = pts.get(i);
        System.out.println(pt.x + " " + pt.y);
    }   

输出:

1 5
2 3
3 4
3 5

@amit解释了该怎么做。 我只是想补充一点,您不想按字典顺序对数字数据进行排序。 如果你这样做,你会得到

1 1
10 1
2 1
etc.

因为按字典顺序10在1之前和2之后。您想要执行常规数字排序。 有时将其称为“自然”排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM