Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按字典顺序对点数组排序_Java_Sorting - Fatal编程技术网

Java 按字典顺序对点数组排序

Java 按字典顺序对点数组排序,java,sorting,Java,Sorting,我试图以字典顺序解一个包含所有整数的NX2数组。我没有办法实现它。而且,这应该在尽可能短的时间内完成。下面是一个例子 输入 输出 1 1 2 1 2 2 4 3 10 1 使用两个整数字段实现您自己的类Point 使其实现(或为此类实现) 填充这些点的数组或,并分别使用相关的sort:或对其进行排序 迭代生成的数组/列表并提取回您的点 使用两个整数字段实现您自己的类Point 使其实现(或为此类实现) 填充这些点的数组或,并分别使用相关的sort:或对其进行排序 迭代生成的数组/列表并提取回您

我试图以字典顺序解一个包含所有整数的NX2数组。我没有办法实现它。而且,这应该在尽可能短的时间内完成。下面是一个例子

输入

输出

1 1
2 1
2 2
4 3
10 1
  • 使用两个整数字段实现您自己的类
    Point
  • 使其实现(或为此类实现)
  • 填充这些点的数组或,并分别使用相关的sort:或对其进行排序
  • 迭代生成的数组/列表并提取回您的点
  • 使用两个整数字段实现您自己的类
    Point
  • 使其实现(或为此类实现)
  • 填充这些点的数组或,并分别使用相关的sort:或对其进行排序
  • 迭代生成的数组/列表并提取回您的点

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

    1 1
    10 1
    2 1
    etc.
    
    因为从词典学上讲,10正好在1之后,2之前。
    您希望执行常规数字排序。有时它被称为“自然”排序

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

    1 1
    10 1
    2 1
    etc.
    
    因为从词典学上讲,10正好在1之后,2之前。
    您希望执行常规数字排序。有时它被称为“自然”排序

    这与对一组整数进行排序基本相同,只是需要对一组对象(在本例中是元组,或者在代码中是两项int数组)进行排序,而不是对整数进行排序

    与Python不同,Java不会自动推断int[]之类的字典顺序,因此您可以将其传递到排序函数中,并期望它能够正常工作。幸运的是,java允许您定义排序应该是什么,然后使用内置的排序方法对其进行排序。这是通过实现一个
    比较器
    ,然后定义告诉它如何比较两个对象的
    比较
    方法来实现的

    下面给出了一个(非常简化的)示例

    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));
                    }
            }
    }
    
    import java.util.*;
    班长{
    公共静态void main(字符串参数[]){
    int[][]数组={{2,2},{1,1},{4,3},{2,1},{10,1};
    sort(数组,新的比较器(){
    公共整数比较(整数[]a,整数[]b){
    //假设数组长度为2
    int x,y;
    如果(a[0]!=b[0]){
    x=a[0];y=b[0];
    }
    否则{
    x=a[1];y=b[1];
    }
    
    if(x这与对一组整数进行排序基本相同,只是需要对一组对象(在本例中是元组,或者在代码中是两项int数组)进行排序,而不是整数

    与Python不同,Java不会自动推断int[]等事物的字典顺序,因此您可以将其传递到一个排序函数中并期望它工作。幸运的是,java允许您定义排序应该是什么,然后使用内置的排序方法对其进行排序。这是通过实现一个
    比较器
    ,然后定义它的
    比较
    方法来完成的,该方法告诉您如何比较两个对象

    下面给出了一个(非常简化的)示例

    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));
                    }
            }
    }
    
    import java.util.*;
    班长{
    公共静态void main(字符串参数[]){
    int[][]数组={{2,2},{1,1},{4,3},{2,1},{10,1};
    sort(数组,新的比较器(){
    公共整数比较(整数[]a,整数[]b){
    //假设数组长度为2
    int x,y;
    如果(a[0]!=b[0]){
    x=a[0];y=b[0];
    }
    否则{
    x=a[1];y=b[1];
    }
    
    如果(x此处,请尝试将此点类与比较器一起使用:

    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类与comparator一起使用:

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

    现在我正在使用这个方法:现在我的问题是我需要声明特定大小的数组(这意味着所有元素都初始化为0)。我需要向数组中添加一行,对整个矩阵进行排序并执行一些操作,然后添加另一行,对整个矩阵进行排序,然后执行一些操作,直到指定的大小。因为所有元素最初都是0,所以当添加新行并对其进行排序时,它会进入矩阵的底部。有其他方法吗?我不想实现它现在我使用这个方法:现在我的问题是我需要声明特定大小的数组(这意味着所有元素都初始化为0)。我需要向数组中添加一行,对整个矩阵进行排序并执行一些操作,然后添加另一行,对整个矩阵进行排序,然后执行一些操作,直到指定的大小。因为所有元素最初都是0,所以当添加新行并对其进行排序时,它会进入矩阵的底部。有其他方法吗?我不想实现它他的使用要点。看看。看看。