【问题标题】:Comparing two object of type circle比较两个圆形类型的对象
【发布时间】:2017-09-30 05:36:30
【问题描述】:

创建一个名为“Circle”的 Java 类,该类实现 java.io.Serializable 接口并根据半径对圆进行建模。半径不能小于零。实现半径的getter和setter方法。还包括在 circle 类中覆盖 toString 。创建类的比较器,用于比较两个 Circle 类型的对象。

这是我目前所拥有的

import java.io.Serializable;


public class Circle implements Serializable, Comparable<Circle> {

private int radius = 1;

public Circle() {
}


public Circle(int radius) {
    setRadius(radius);

}

public void setRadius(int v) {
    if (v > 0) {
        this.radius = v;
    }

}

public int getRadius() {
    return this.radius;

}



@Override
public String toString() {
    return "Circle{" + "radius=" + radius + '}';
}

@Override
public int compareTo(Circle o) {
    //no idea what to put here

}



}

这是我的比较器类

 import java.util.Comparator;

public class CompareCircle implements Comparator<Circle> {

CompareCircle(Circle c1, Circle c2) {

}

@Override
public int compare(Circle o1, Circle o2) {
    if (o1.getRadius() > o2.getRadius()) {
        return o1.getRadius();
    } else {
        return o2.getRadius();
    }

}
}

我的问题是我做对了吗?

【问题讨论】:

  • 不,你没有。阅读 Comparator 的 javadoc 以了解它的用途,以及它的 compare() 方法应该返回什么。不要实现 Comparable 是您使用 Comparator 来比较圆圈。
  • //不知道放什么 - 你可以写'return Integer.comapre(this.getRadius(), o.getRadius())'

标签: java compare comparator comparable


【解决方案1】:

首先,您不需要实现Comparable 或覆盖compareTo()

根据documentation,这是compare() 应该返回的:

返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个参数。

您可以使用Integer.compare() 来满足这些要求:

返回: 如果 x == y,则值为 0;如果 x y

,则值大于 0
import java.util.Comparator;

public class CompareCircle implements Comparator<Circle> {
    @Override
    public int compare(Circle o1, Circle o2) {
        return Integer.compare(o1.getRadius(), o2.getRadius());
    }
}

要进行比较,您需要创建一个CompareCircle 的实例。您可以将它与Collections.max() 一起使用来检索最大的对象:

import java.util.ArrayList;
import java.util.Collections;

public class Main {
    public static void main(String[] args){
        ArrayList<Circle> list = new ArrayList<Circle>() {{
            add(new Circle(4));
            add(new Circle(7));
            add(new Circle(2));
        }};

        CompareCircle comp = new CompareCircle();
        Circle c = Collections.max(list, comp);

        System.out.println(c.getRadius());
    }
}

输出:

7

【讨论】:

  • 请不要宣传使用减法来实现两个整数的比较。使用 Integer.compare()。由于具有非常大的值的整数溢出,减法将失败。
  • 如果我想返回 2 或 3 个圆圈中最大的怎么办?
  • @JohnCasey 使用Collections.max() - 我已经更新了我的答案。 @JBNizet 在这种情况下,我假设半径永远不会是负数,因为它在几何上没有意义。因此,不会发生溢出。但是,这是一种很好的做法,我已经更新了代码。
【解决方案2】:

正如 JB 指出的那样,Circle 类不需要实现 Comparable,如果你使用了 Comperator:

public class Circle implements Serializable /*, Comparable<Circle> */{

CompareCircle 中可以删除构造函数(实际上使用默认构造函数 CompareCircle() )。
compare 方法也应该处理两个相等圆的情况:

@Override
public int compare(Circle o1, Circle o2) {
    //you may want to consider cases where one circle or both are null 
    if (o1.getRadius() > o2.getRadius()) {
        return o1.getRadius();
    } else if (o1.getRadius() == o2.getRadius()) {
        return 0;
    }           
       return o2.getRadius();
    }   
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2012-09-07
    • 2018-05-08
    相关资源
    最近更新 更多