标签: comparable

为什么compareTo返回一个整数

我最近在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 …

c# java comparable comparator

22
推荐指数
2
解决办法
2460
查看次数

订购一个hashset示例?

我需要一个关于如何在a上使用类似的类HashSet来获得升序的示例.假设我有HashSet这样一个:

HashSet<String> hs = new HashSet<String>();
Run Code Online (Sandbox Code Playgroud)

我怎样才能hs按升序排列?

java hashset comparable sortedset data-structures

20
推荐指数
2
解决办法
5万
查看次数

创建compareTo到实现Comparable的泛型类

我有一个带有两个类型变量的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)?谢谢您的帮助!

java generics interface comparable

19
推荐指数
2
解决办法
4万
查看次数

Java,如果compareTo()返回0,为什么暗示对象是相等的?

我们上课吧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)

java equals comparable comparator

19
推荐指数
3
解决办法
1万
查看次数

为什么Arrays.sort采用Object []而不是Comparable []?

我想知道为什么Arrays类的sort方法要求Object []类型的参数.为什么参数不是Comparable []类型.如果你没有传递Comparable [],它会生成一个ClassCastException.

为什么... public static void sort(Object [] a)而不是public static void sort(Comparable [] a)?谢谢

java casting interface comparable

18
推荐指数
1
解决办法
931
查看次数

Java:要在一个充满自定义对象的ArrayList中使用contains我应该覆盖equals还是实现Comparable/Comparator?

我有一个完整的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)

java collections equals comparable comparator

18
推荐指数
1
解决办法
3万
查看次数

如何实现可比性,使其与身份平等一致

我有一类必须根据对象标识(即equals())定义相等性(按)。this == other

我想实现Comparable对此类对象进行排序(例如通过某些getName()属性)。要与其保持一致equals()compareTo()不能返回0,即使两个对象具有相同的名称。

有没有一种在意义上比较对象身份的方法compareTo?我可以比较一下System.identityHashCode(o),但0在发生哈希冲突的情况下仍然可以返回。

java equals comparable comparator

18
推荐指数
3
解决办法
2641
查看次数

使用Collections.sort(object)比较Long值

我试图将一个简单的对象列表排序很长时间 - 以下是不起作用的,因为其中一个长字符串被推到顶部只是因为它以较低的数字开头.所以我正在寻找一种方法来直接对实际的长值进行排序

当前的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)

java sorting comparable

17
推荐指数
4
解决办法
4万
查看次数

比较与equals一致意味着什么?如果我的班级不遵循这个原则,可能会发生什么?

从TreeMap的JavaDoc:

请注意,如果此有序映射要正确实现Map接口,则由有序映射维护的排序(无论是否提供显式比较器)必须与equals一致.(请参阅Comparable或Comparator以获得与equals一致的精确定义.)这是因为Map接口是根据equals操作定义的,但是map使用compareTo(或compare)方法执行所有键比较,因此有两个键从排序地图的角度来看,通过这种方法被视为相等的是相等的.即使排序与equals不一致,也可以很好地定义有序映射的行为.它只是不遵守Map接口的一般合同.

有人可以给出一个具体的例子来说明如果排序与equals不一致可能会出现的问题吗?举例来说,用户定义的类具有自然顺序,即它实现了Comparable.JDK中的所有内部类都保持这个不变量吗?

java comparison equals comparable comparator

17
推荐指数
4
解决办法
1万
查看次数

应该比较另一种类型吗?

我想知道以下是否有一个有效的用例:

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)

java comparable

16
推荐指数
1
解决办法
508
查看次数