我最近在SO聊天中看到了一个讨论,但没有明确的结论,所以我最后在那里问.
这是出于历史原因还是与其他语言的一致性?在查看compareTo各种语言的签名时,它会返回一个int.
为什么它不返回枚举.例如在C#中我们可以这样做:
enum CompareResult {LessThan, Equals, GreaterThan};
Run Code Online (Sandbox Code Playgroud)
并且:
public CompareResult CompareTo(Employee other) {
if (this.Salary < other.Salary) {
return CompareResult.LessThan;
}
if (this.Salary == other.Salary){
return CompareResult.Equals;
}
return CompareResult.GreaterThan;
}
Run Code Online (Sandbox Code Playgroud)
在Java中,枚举是在这个概念之后引入的(我不记得有关C#)但它可以通过额外的类来解决,例如:
public final class CompareResult {
public static final CompareResult LESS_THAN = new Compare();
public static final CompareResult EQUALS = new Compare();
public static final CompareResult GREATER_THAN = new Compare();
private CompareResult() {}
}
Run Code Online (Sandbox Code Playgroud)
和
interface Comparable<T> {
Compare compareTo(T obj);
}
Run Code Online (Sandbox Code Playgroud)
我问这个是因为我不认为一个int …
我需要一个关于如何在a上使用类似的类HashSet来获得升序的示例.假设我有HashSet这样一个:
HashSet<String> hs = new HashSet<String>();
Run Code Online (Sandbox Code Playgroud)
我怎样才能hs按升序排列?
我有一个带有两个类型变量的Generic Class,它实现了java.lang.Comparable.
public class DoubleKey<K,J> implements Comparable<DoubleKey<K,J>>{
private K key1;
private J key2;
public DoubleKey(K key1, J key2){
this.key1 = key1;
this.key2 = key2;
}
public K getFirstKey(){
return this.key1;
}
public J getSecondKey(){
return this.key2;
}
// need for Comparable interface
public int compareTo(DoubleKey<K,J> aThat){
...
}
}
因为我用Comparable实现它,我需要编写compareTo()方法.因为K,J可以是任何类型,我在如何完全比较它时遇到问题.有没有办法能够在比较中捕获所有可能的类型(Primitive,Wrapper,Object)?谢谢您的帮助!
我们上课吧Person.人有名字和身高.
Equals和hashCode()仅考虑名称.人是可比的(或者我们为它实施比较,无论哪一个).人员按身高进行比较.
期望两个不同的人可以具有相同高度的情况似乎是合理的,但是例如.TreeSet的行为类似于comapareTo()== 0表示等于,而不仅仅是相同的大小.
为了避免这种情况,如果大小相同,比较可以继续查看其他内容,但是它不能用于检测相同大小的不同对象.
例:
import java.util.Comparator;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
public class Person implements Comparable<Person> {
private final String name;
private int height;
public Person(String name,
int height) {
this.name = name;
this.height = height;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public String getName() {
return name;
}
@Override
public int compareTo(Person o) {
return Integer.compare(height, o.height);
}
public boolean equals(Object …Run Code Online (Sandbox Code Playgroud) 我想知道为什么Arrays类的sort方法要求Object []类型的参数.为什么参数不是Comparable []类型.如果你没有传递Comparable [],它会生成一个ClassCastException.
为什么... public static void sort(Object [] a)而不是public static void sort(Comparable [] a)?谢谢
我有一个完整的ArrayList:
class TransitionState {
Position positionA;
Position positionB;
int counter;
public boolean equals (Object o){
if (o instanceof TransitionState){
TransitionState transitionState= (TransitionState)o;
if ((this.positionA.equals(transitionState.positionA))
&&(this.positionB.equals(transitionState.positionB)))
{
return true;
}
}
return false;
}
@Override
public String toString() {
String output = "Position A " + positionA.i+ " "+ positionA.j + " "+ positionA.orientation + " "+
"Position B " + positionB.i + " "+ positionB.j + " "+ positionB.orientation;
return output;
}
}
class Position {
int i;
int j; …Run Code Online (Sandbox Code Playgroud) 我有一类必须根据对象标识(即equals())定义相等性(按)。this == other
我想实现Comparable对此类对象进行排序(例如通过某些getName()属性)。要与其保持一致equals(),compareTo()不能返回0,即使两个对象具有相同的名称。
有没有一种在意义上比较对象身份的方法compareTo?我可以比较一下System.identityHashCode(o),但0在发生哈希冲突的情况下仍然可以返回。
我试图将一个简单的对象列表排序很长时间 - 以下是不起作用的,因为其中一个长字符串被推到顶部只是因为它以较低的数字开头.所以我正在寻找一种方法来直接对实际的长值进行排序
当前的obj实现类似于下面的内容.在我正在使用的课程中,我称之为Collections.sort(树);
public class Tree implements Comparable<Tree> {
public String dist; //value is actually Long
public int compareTo(Tree o) {
return this.dist.compareTo(o.dist);
}
}
Run Code Online (Sandbox Code Playgroud) 从TreeMap的JavaDoc:
请注意,如果此有序映射要正确实现Map接口,则由有序映射维护的排序(无论是否提供显式比较器)必须与equals一致.(请参阅Comparable或Comparator以获得与equals一致的精确定义.)这是因为Map接口是根据equals操作定义的,但是map使用compareTo(或compare)方法执行所有键比较,因此有两个键从排序地图的角度来看,通过这种方法被视为相等的是相等的.即使排序与equals不一致,也可以很好地定义有序映射的行为.它只是不遵守Map接口的一般合同.
有人可以给出一个具体的例子来说明如果排序与equals不一致可能会出现的问题吗?举例来说,用户定义的类具有自然顺序,即它实现了Comparable.JDK中的所有内部类都保持这个不变量吗?
我想知道以下是否有一个有效的用例:
class Base {}
class A implements Comparable<Base> {
//...
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个常见的模式(见集合了大量的实例)接受类型的集合T,其中T extends Comparable<? super T>.
但是在技术上似乎不可能compareTo()在与基类进行比较时履行合同,因为没有办法确保另一个类不会通过相互矛盾的比较扩展基础.请考虑以下示例:
class Base {
final int foo;
Base(int foo) {
this.foo = foo;
}
}
class A extends Base implements Comparable<Base> {
A(int foo) {
super(foo);
}
public int compareTo(Base that) {
return Integer.compare(this.foo, that.foo); // sort by foo ascending
}
}
class B extends Base implements Comparable<Base> {
B(int foo) {
super(foo);
}
public int …Run Code Online (Sandbox Code Playgroud) comparable ×10
java ×10
comparator ×5
equals ×4
interface ×2
c# ×1
casting ×1
collections ×1
comparison ×1
generics ×1
hashset ×1
sortedset ×1
sorting ×1