2012-01-09 65 views
1

我试图解决字母排序的所有整数的NX2阵列二维坐标数组。我不知道如何实现它。我认为Python中有lexsort,但在java中没有这种类型的函数。这也应该尽可能少。这里的例子:Lexographically分拣用java

Input: 
2 2 
1 1 
4 3 
2 1 
10 1 
Output: 
1 1 
2 1 
2 2 
4 3 
10 1 
+0

你确定你要找的字典顺序?你的输出结果是'10 1',我不认为你的建议。 – 2012-01-09 07:11:44

+0

^是的,如果你采取列明智的,10到最后.. – sgowd 2012-01-09 07:23:14

+0

看起来@AlexR也注意到了它。你的意思是做一个数字排序,如果每个数字被解释为一个字符串,则不是基于字符的排序。这是什么让它不是字典顺序。 – 2012-01-09 07:25:44

回答

5

实现自己的类:Point与两个整数的领域。
让它实现Comparable或实现此一等级Comparator
填充数组或这些点的List,并使用相关排序排序是:Arrays.sort()Collections.sort()分别
迭代结果数组/列表并提取回您的观点。

+0

现在我正在使用这种方法:http://stackoverflow.com/questions/4359869/sorting-2-dimensional-java-array 现在我的问题是我需要声明特定大小的数组(这意味着所有元素都被初始化为0)。我需要向数组添加一行,对整个矩阵进行排序,然后添加另一行,对整个矩阵进行排序,执行一些操作,直到指定的大小。 因为所有元素最初都是0,所以当新行被添加和排序时,它会进入矩阵的底部。有没有其他方法呢?我不想使用Points实现这个。 – sgowd 2012-01-09 07:59:29

1

@amit解释做什么。我只想补充一点,你不想按照字典顺序排列数字数据。如果你这样做你会得到

1 1 
10 1 
2 1 
etc. 

因为字典序10仅有1后前2 你要定期进行数字排序。有时它被称为“自然”排序。

1

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

不同的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)); 
       } 
     } 
} 
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