比较两个圆形类型的对象
Comparing two object of type circle
创建一个名为“Circle”的Javaclass实现java.io.Serializable接口并根据半径模拟一个圆。半径不能小于零。为半径实现 getter 和 setter 方法。还包括在圆 class 中覆盖 toString。创建 class' 比较器,它比较两个 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
}
}
这是我的比较器class
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();
}
}
}
我的问题是我这样做对不对?
首先,您不需要实施 Comparable
或覆盖 compareTo()
。
根据 documentation,这是 compare()
应该 return:
Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
您可以使用Integer.compare()来满足这些要求:
Returns:
the value 0 if x == y; a value less than 0 if x < y; and a value greater than 0 if x > y
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
正如 JB 指出的那样 Circle
class 如果你使用 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();
}
}
创建一个名为“Circle”的Javaclass实现java.io.Serializable接口并根据半径模拟一个圆。半径不能小于零。为半径实现 getter 和 setter 方法。还包括在圆 class 中覆盖 toString。创建 class' 比较器,它比较两个 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
}
}
这是我的比较器class
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();
}
}
}
我的问题是我这样做对不对?
首先,您不需要实施 Comparable
或覆盖 compareTo()
。
根据 documentation,这是 compare()
应该 return:
Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
您可以使用Integer.compare()来满足这些要求:
Returns: the value 0 if x == y; a value less than 0 if x < y; and a value greater than 0 if x > y
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
正如 JB 指出的那样 Circle
class 如果你使用 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();
}
}