Java 我试着按字典顺序排列矩形。(x、y、宽度、高度)

Java 我试着按字典顺序排列矩形。(x、y、宽度、高度),java,comparator,lexicographic,Java,Comparator,Lexicographic,如果矩形具有相同的x值,则比较y值,然后检查宽度和高度等 public class RectangleTester { public static void main(String[] args) { ArrayList<Rectangle2D> list = new ArrayList<>(); list.add(new Rectangle2D.Double(100,100,50,50)); list.ad

如果矩形具有相同的x值,则比较y值,然后检查宽度和高度等

public class RectangleTester
{
    public static void main(String[] args)
    {
        ArrayList<Rectangle2D> list = new ArrayList<>();
        list.add(new Rectangle2D.Double(100,100,50,50));
        list.add(new Rectangle2D.Double(120,80,54,75));
        list.add(new Rectangle2D.Double(85,95,60,55));
        list.add(new Rectangle2D.Double(100,95,55,55));
        list.add(new Rectangle2D.Double(100,95,55,52));

        System.out.println("\nUnsorted Rectangles:");
        for (Rectangle2D temp : list)
            System.out.println(temp.toString() + " Y: " + temp.getY());

如您所见,使用x值对矩形进行了正确排序,但当多个矩形具有相同的x值时,排序无法将它们按正确的顺序排列。如果我的if语句有逻辑性,我就需要另一双眼睛

第一个错误,您正在将对象与
=
进行比较<代码>=比较引用,而不是值

第二个错误,你的逻辑是错误的,不必要的复杂。只需按照您描述的方式实现它:如果矩形具有相同的x值,则比较y值:

有了番石榴,就可以很容易地用

return ComparisonChain.start()
                      .compare(r1X, r2X)
                      .compare(r1Y, r2Y)
                      .compare(r1Width, r2Width)
                      .compare(r1Height, r2Height)
                      .result();
使用Java 8,它将更加干净:

Comparator<Rectangle> comparator = 
    Comparator.comparing(Rectangle::getX)
              .thenComparing(Rectangle::getY)
              .thenComparing(Rectangle::getWidth)
              .thenComparing(Rectangle::getHeight)
比较器比较器=
Comparator.comparing(矩形::getX)
.Then比较(矩形::getY)
.Then比较(矩形::getWidth)
.Then比较(矩形::getHeight)

LOL。我真是个比较那样的东西的白痴。难怪我的逻辑都不起作用。上面的代码只是我尝试的最新代码。我的原创很像你的。谢谢你指出我的错误。
int result = r1X.compareTo(r2X);
if (result == 0) {
    result = r1Y.compareTo(r2Y);
}
if (result == 0) {
    result = r1Width.compareTo(r2Width);
}
if (result == 0) {
    result = r1Height.compareTo(r2Height);
}
return result;
return ComparisonChain.start()
                      .compare(r1X, r2X)
                      .compare(r1Y, r2Y)
                      .compare(r1Width, r2Width)
                      .compare(r1Height, r2Height)
                      .result();
Comparator<Rectangle> comparator = 
    Comparator.comparing(Rectangle::getX)
              .thenComparing(Rectangle::getY)
              .thenComparing(Rectangle::getWidth)
              .thenComparing(Rectangle::getHeight)