比较两种类型的圆形对象

时间:2017-09-30 05:36:31

标签: java compare comparator comparable

创建一个名为“Circle”的Java类,它实现java.io.Serializable接口并根据radius建模一个圆。半径不能小于零。实现半径的getter和setter方法。还包括在圆类中覆盖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();
    }

}
}

我的问题是我做对了还是没有?

2 个答案:

答案 0 :(得分:1)

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

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

  

当第一个参数小于,等于或大于第二个参数时,返回负整数,零或正整数。

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

  

返回:   如果x == y,则值为0;如果x <1,则小于0的值。 Ÿ;如果x> 1,则值大于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

答案 1 :(得分:-1)

正如JB指出的那样Circle如果使用comperator,则不需要实现Comparable

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();
    }   
}