【问题标题】:TreeSet Rectangle ComparatorTreeSet 矩形比较器
【发布时间】:2016-10-27 14:07:31
【问题描述】:

快速提问,我在创建自己的 TreeSet 矩形比较器时遇到了很多麻烦。这是我拥有的代码,但我非常迷茫。我想比较矩形的面积并按升序对它们进行排序。

import java.util.TreeSet;
import java.awt.Rectangle;
import java.util.Comparator;

public class RectComp implements Comparator<Rectangle>
{
    private double width;
    private double height;

    public RectComp(Comparator comp)
    {
        this.width = width;
        this.height = height;
    }

    public double getArea()
    {
        return width * height;
    }

    public int compare(Rectangle r1, Rectangle r2)
    {
        double diff = r1.getArea() - r2.getArea();

        if (diff < 0)
            return -1;
        else if (diff == 0)
            return 0;
        else
            return 1;
    }

    public static void main(String[] args)
    {
        TreeSet<Rectangle> set = new TreeSet<>(new RectComp());

        set.add(new Rectangle(1, 10));
        set.add(new Rectangle(10, 1));
        set.add(new Rectangle(5, 3));
        set.add(new Rectangle(5, 2));
        set.add(new Rectangle(5, 1));

        for (Rectangle r : set) {
            System.out.println(r);
        }
    }
}

【问题讨论】:

    标签: java comparator treeset


    【解决方案1】:

    根据您的代码,您完全迷失了方向。这是比较类

        public class RectComp implements Comparator<Rectangle>{
    
            public int compare(Rectangle r1, Rectangle r2) {
    
                double diff = r1.getHeight()*r1.getWidth() - r2.getHeight()*r2.getWidth();
                if(diff < 0)
                    return -1;
                else if (diff == 0)
                    return 0;
                else return 1;
            }
    }
    

    【讨论】:

    • 你有一个错字,它是 getHeight()。您还可以通过返回 Math.signum(diff) 来避免 if/else 逻辑
    • @Palamino 感谢您指出错字。我宁愿保留 if else 逻辑,因为对于新的 Java 程序员来说更容易理解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多