1

我有点数组:Point[] p = new Point[]

我想按 x 排序,然后按 y 排序。意思是,如果我有

Point A = (1, 2)
Point B = (2, 1)
Point C = (1, 3)
Point D = (2, 2)

排序后,我会得到:[(1,2), (1,3), (2,1), (2,2)]

我尝试使用Arrays.sort(),但点是不可比较的。有一种简单的方法可以做到这一点吗?

4

4 回答 4

3

您可以使用Arrays.sort自定义Comparer<Point>

Arrays.sort(p, new Comparator<Point>() {
    int compare(Point a, Point b) {
        int xComp = Integer.compare(a.x, b.x);
        if(xComp == 0)
            return Integer.compare(a.y, b.y);
        else
            return xComp;
    }
});

旁注:

  • 如果您的某些Point对象可能是null,您必须在compareTo.
  • 如果你Point的不是 AWT 点而是你自己的类,你最好让它实现Comparable
于 2013-05-01T12:15:18.650 回答
1

让我们Point实现Comparable接口,并覆盖它的compareTo方法以满足您的需要。

    @Override
    public int compareTo(Point p) {
      if (this.x != p.x) {
        return Integer.compareTo(this.x, p.x);
      } else {
        return Integer.compareTo(this.y, p.y);
      }
    }

阅读更多:http: //javarevisited.blogspot.com/2012/01/how-to-sort-arraylist-in-java-example.html#ixzz2S2i9k5V3

这需要编辑Point类。如果这不可能,请参阅其他答案以获取替代解决方案。

于 2013-05-01T12:13:58.147 回答
1

你可以试试(伪代码)。

   Arrays.sort(p, new Comparator<Point >() {
        public int compare(Point p1, Point p2) {

             //here operations and return
        }
    });
于 2013-05-01T12:16:22.093 回答
0

由于 Point 没有实现可比较,您可以创建自己的类进行比较:

public class Sorter implements Comparator 
{
  public int compare(Object o1, Object o2)
  {
    Point pointOne = (Point)o1;
    Point pointTwo = (Point)o2;
    return ((pointOne.getX()+pointOne.getY())+"").compareTo(((pointTwo.getX()+pointTwo.getY())+""));
  }
}

然后你可以使用这个 Sorter 类:

void mySortingFunc(Point[] points)
{
  Arrays.sort(points, new Sorter());
}
于 2013-05-01T12:21:41.423 回答