按字典顺序排序一系列点

时间:2012-01-09 07:06:32

标签: java sorting

我试图按字典顺序解决所有整数的NX2数组。我没有办法如何实现它。此外,这应该尽可能少地完成。这是一个例子。

输入

2 2
1 1
4 3
2 1
10 1

输出

1 1
2 1
2 2
4 3
10 1

4 个答案:

答案 0 :(得分:5)

  1. 使用两个整数字段实现自己的类Point
  2. 实施Comparable(或为此课程实施Comparator)。
  3. 填充这些点的数组或List,并使用相应的排序对其进行排序:Arrays.sort()Collections.sort()
  4. 迭代生成的数组/列表并提取您的积分。

答案 1 :(得分:1)

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

与Python不同,Java不会自动推断像int []之类的字典排序,因此您可以将其传递给排序函数并期望它能够正常工作。幸运的是,java允许您定义排序应该是什么,然后使用内置排序方法对其进行排序。这是通过实现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));
                }
        }
}

答案 2 :(得分:0)

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

1 1
10 1
2 1
etc.

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

答案 3 :(得分:0)

这里尝试将此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