使 java class 可与 2 个不同的 类 相媲美
Make java class Comparable to 2 different Classes
我想实现 Comparable 接口 "Twice"
public class Segment implements Comparable<Segment,Point>{
@Override
public int compareTo(Segment o) {
return 0;
}
@Override
public int compareTo(Point p) {
return 0;
}
有可能吗? (不使用通用接口 compareTo(Object o) 我认为它很讨厌...)
如果你的 Segment 和 Point 都实现了相同的接口或者它们是父子,你可以这样做。
您只能实现一次 Comparable,但您可以多次使用 Comparator 接口 --> http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html
它有 int compare(T o1, To o2) 而不是 Comparable 的 compareTo。例如,如果您想对 collection 进行排序,那么您可以使用:
Collections.sort(您的列表,您的新比较器 object)
如果你正在做集合排序那么使用比较器
/**
* Comparator implementation which sorts Person objects on person_id field
*/
public class SortByPerson_ID implements Comparator{
public int compare(Object o1, Object o2) {
Person p1 = (Person) o;
Person p2 = (Person) o;
return p1.getPersonId() - p2.getPersonId();
}
}
排序-
Collections.sort(perSonlist, new SortByPerson_ID());
阅读更多:http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html#ixzz3RKoKZpB5
为什么不试试这个
public class Segment implements Comparable<Object>{
@Override
public int compareTo(Object o) {
if(o instanceof Segment)
{
return 0;
}
else if(o instanceof Point)
{
return 0;
}
}
}
好吧,如果你真的想按照你的方式去做,那么你可以使用 overloading
添加另一种方法(不添加 @Override
注释)。
public class Segment implements Comparable<Segment>{
@Override
public int compareTo(Segment o) {
return 0;
}
public int compareTo(Point p) {
return 0;
}
}
手动调用compareTo
方法会有用。我不确定他们从其他一些库方法中调用会发生什么。
作为设计模式,这不是一个好主意。而且,顺便说一句,在Java中是不可能的,因为Comparable和Comparable由于类型擦除是相同的二进制接口。
无论如何,我会尝试解释为什么我认为这是个坏主意。当您实现 Comparable
时,您正在定义所谓的 "natural sorting",这是 class 本身固有的排序,一种自然排序。此排序应涉及 class 和相同 class 的元素。所以,我认为(这纯粹是个人意见)你应该只用与你正在实施的相同的 class 来实施 Comparable
。
如果你想比较线段和点,这当然是完全合法的事情,只要你有一个明确定义的顺序。您可以通过实施所谓的 "external comparator" 来实现,即实施 Comparator<X>
的 class,其中 X 是 Point
和 Segment
。 Java 标准 classes 和函数准备始终接受可选的外部比较器,因为通常,您可能希望对相同 class 的对象使用不同的排序标准。
你们似乎没有共同点class/interface。也许你应该定义一个,毕竟它们都是几何实体。到目前为止,您唯一可以做的就是使用 Comparator<Object>
,然后使用 instanceof
运算符来检查类型。这是很多样板代码,而且,我认为,糟糕的设计:既然你说点和段是可比较的,那么它们应该有一些你希望比较的共同点 属性。然后这个 属性 应该成为公共基础 class 的方法或它们都实现的接口(实际上,这可能会导致您再次使用 Comparable
,但以更简洁的方式)。
例如,假设您要根据坐标比较点和线段,并且希望在排序时考虑线段的中值。然后,您可以执行以下操作:
public abstract class GeometricEntity implements Comparable<GeometricEntity> {
protected abstract Point getSortingPoint();
@Override
public int compareTo(GeometricEntity other) {
//Compare by getSortingPoint
}
}
public class Point implements GeometricEntity {
@Override
protected Point getSortingPoint() { return this; }
}
public class Segment implements GeometricEntity {
private Point ptFrom;
private Point ptTo;
@Override
protected Point getSortingPoint() { return meanPoint(ptFrom, ptTo); }
}
我想实现 Comparable 接口 "Twice"
public class Segment implements Comparable<Segment,Point>{
@Override
public int compareTo(Segment o) {
return 0;
}
@Override
public int compareTo(Point p) {
return 0;
}
有可能吗? (不使用通用接口 compareTo(Object o) 我认为它很讨厌...)
如果你的 Segment 和 Point 都实现了相同的接口或者它们是父子,你可以这样做。
您只能实现一次 Comparable,但您可以多次使用 Comparator 接口 --> http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html
它有 int compare(T o1, To o2) 而不是 Comparable 的 compareTo。例如,如果您想对 collection 进行排序,那么您可以使用:
Collections.sort(您的列表,您的新比较器 object)
如果你正在做集合排序那么使用比较器
/**
* Comparator implementation which sorts Person objects on person_id field
*/
public class SortByPerson_ID implements Comparator{
public int compare(Object o1, Object o2) {
Person p1 = (Person) o;
Person p2 = (Person) o;
return p1.getPersonId() - p2.getPersonId();
}
}
排序-
Collections.sort(perSonlist, new SortByPerson_ID());
阅读更多:http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html#ixzz3RKoKZpB5
为什么不试试这个
public class Segment implements Comparable<Object>{
@Override
public int compareTo(Object o) {
if(o instanceof Segment)
{
return 0;
}
else if(o instanceof Point)
{
return 0;
}
}
}
好吧,如果你真的想按照你的方式去做,那么你可以使用 overloading
添加另一种方法(不添加 @Override
注释)。
public class Segment implements Comparable<Segment>{
@Override
public int compareTo(Segment o) {
return 0;
}
public int compareTo(Point p) {
return 0;
}
}
手动调用compareTo
方法会有用。我不确定他们从其他一些库方法中调用会发生什么。
作为设计模式,这不是一个好主意。而且,顺便说一句,在Java中是不可能的,因为Comparable和Comparable由于类型擦除是相同的二进制接口。
无论如何,我会尝试解释为什么我认为这是个坏主意。当您实现 Comparable
时,您正在定义所谓的 "natural sorting",这是 class 本身固有的排序,一种自然排序。此排序应涉及 class 和相同 class 的元素。所以,我认为(这纯粹是个人意见)你应该只用与你正在实施的相同的 class 来实施 Comparable
。
如果你想比较线段和点,这当然是完全合法的事情,只要你有一个明确定义的顺序。您可以通过实施所谓的 "external comparator" 来实现,即实施 Comparator<X>
的 class,其中 X 是 Point
和 Segment
。 Java 标准 classes 和函数准备始终接受可选的外部比较器,因为通常,您可能希望对相同 class 的对象使用不同的排序标准。
你们似乎没有共同点class/interface。也许你应该定义一个,毕竟它们都是几何实体。到目前为止,您唯一可以做的就是使用 Comparator<Object>
,然后使用 instanceof
运算符来检查类型。这是很多样板代码,而且,我认为,糟糕的设计:既然你说点和段是可比较的,那么它们应该有一些你希望比较的共同点 属性。然后这个 属性 应该成为公共基础 class 的方法或它们都实现的接口(实际上,这可能会导致您再次使用 Comparable
,但以更简洁的方式)。
例如,假设您要根据坐标比较点和线段,并且希望在排序时考虑线段的中值。然后,您可以执行以下操作:
public abstract class GeometricEntity implements Comparable<GeometricEntity> {
protected abstract Point getSortingPoint();
@Override
public int compareTo(GeometricEntity other) {
//Compare by getSortingPoint
}
}
public class Point implements GeometricEntity {
@Override
protected Point getSortingPoint() { return this; }
}
public class Segment implements GeometricEntity {
private Point ptFrom;
private Point ptTo;
@Override
protected Point getSortingPoint() { return meanPoint(ptFrom, ptTo); }
}