标签: compareto

如何简化null安全的compareTo()实现?

我正在compareTo()为一个简单的类实现方法(为了能够使用Collections.sort()和Java平台提供的其他好东西):

public class Metadata implements Comparable<Metadata> {
    private String name;
    private String value;

// Imagine basic constructor and accessors here
// Irrelevant parts omitted
}
Run Code Online (Sandbox Code Playgroud)

我希望这些对象的自然顺序为:1)按名称排序; 2)如果名称相同则按值排序; 两种比较都应该不区分大小写.对于这两个字段,空值完全可以接受,因此compareTo在这些情况下不得中断.

脑海中出现的解决方案与以下几行相似(我在这里使用"保护条款",而其他人可能更喜欢单个返回点,但这不是重点):

// primarily by name, secondarily by value; null-safe; case-insensitive
public int compareTo(Metadata other) {
    if (this.name == null && other.name != null){
        return -1;
    }
    else if (this.name != null && other.name == null){
        return 1;
    }
    else if (this.name != null && …
Run Code Online (Sandbox Code Playgroud)

java comparison null refactoring compareto

147
推荐指数
7
解决办法
14万
查看次数

BigDecimal等于()与compareTo()

考虑简单的测试类:

import java.math.BigDecimal;

/**
 * @author The Elite Gentleman
 *
 */
public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BigDecimal x = new BigDecimal("1");
        BigDecimal y = new BigDecimal("1.00");
        System.out.println(x.equals(y));
        System.out.println(x.compareTo(y) == 0 ? "true": "false");
    }

}
Run Code Online (Sandbox Code Playgroud)

你可以(有意识地)说它x等于y(不是对象引用),但是当你运行程序时,以下结果显示:

false
true
Run Code Online (Sandbox Code Playgroud)

问:什么是之间的区别compareTo(),并equals()BigDecimalcompareTo可以确定x等于y

PS:我看到BigDecimal在inflate()方法上有一个equals()方法.inflate()实际上做了什么?

java equals bigdecimal compareto

141
推荐指数
1
解决办法
11万
查看次数

Java字符串:compareTo()与equals()

String我在Java中测试同等性时,我总是使用它,equals()因为对我来说这似乎是最自然的方法.毕竟,它的名字已经说明了它的目的.然而,我最近告诉我的一位同事被教导用compareTo() == 0而不是equals().这感觉不自然(因为compareTo()它意味着提供一种排序,而不是相等的平等),甚至有点危险(因为compareTo() == 0并不一定意味着在所有情况下都是平等的,即使我知道这对我来说也是如此String).

他不知道为什么他被教导用compareTo()而不是equals()用于String,我也找不到任何理由.这真的是个人品味的问题,还是有任何方法的真正原因?

java string equals compareto

113
推荐指数
9
解决办法
15万
查看次数

为什么compareTo在Java上的Enum final?

Java中的枚举实现了Comparable接口.这本来是很好的覆盖ComparablecompareTo方法,但在这里它被标记为最终.Enum's 的默认自然顺序compareTo是列出的顺序.

有谁知道为什么Java枚举有这个限制?

java enums compareto comparable

87
推荐指数
3
解决办法
6万
查看次数

compareTo with primitives - > Integer/int

写作更好吗?

int primitive1 = 3, primitive2 = 4;
Integer a = new Integer(primitive1);
Integer b = new Integer(primitive2);
int compare = a.compareTo(b);
Run Code Online (Sandbox Code Playgroud)

要么

int primitive1 = 3, primitive2 = 4;
int compare = (primitive1 > primitive2) ? 1 : 0;
if(compare == 0){
    compare = (primitive1 == primitive2) ? 0 : -1;
}
Run Code Online (Sandbox Code Playgroud)

我认为第二个更好,应该更快,更多的内存优化.但他们不是一样的吗?

java performance compareto

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

为什么Byte.compare()和Integer.compare()的实现方式不同?

我正在研究OpenJDK的来源.

我的注意力被这些方法所吸引,Byte.compare()并且Integer.compare():

public static int Byte.compare(byte x, byte y) {
    return x-y;
}

public static int Integer.compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
Run Code Online (Sandbox Code Playgroud)

该方法为什么Byte.compare()Integer.compare()有不同的实现?

java compareto

40
推荐指数
2
解决办法
1242
查看次数

比较方法违反了其总合同!仅限Java 7

我知道这已经有一段时间了,并且检查了我以前得到的所有答案,但是这个仍然不起作用.

对象'船员'代表有船员和其他物品的船员.比较应该通过比较'assigned_rank',一个int值,如果这两个实例中的值相等,那么'is_trainer',一个布尔值,应该有所不同.

只要它运行java <7,这种方法就很有效.但是从Java 7开始我就得到了这个:

java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeLo(ComparableTimSort.java:714)
at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:451)
at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:376)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:182)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at java.util.Collections.sort(Collections.java:155)
at dormas_flightlog.Query.getCrew(Query.java:714)
Run Code Online (Sandbox Code Playgroud)

这是源代码,其中一些有潜在危险的部分已经被评论过,但它仍然不起作用:

public class crew implements Serializable, Comparable<crew> {

private static final long serialVersionUID = 36L;
private int flightID = 0;
private int assigned_rank = 25;
private boolean is_trainer = false;
...


@Override
public int compareTo(crew him) {

    int myRank = this.getAssigned_rank();
    int hisRank = him.assigned_rank;

    if (this == him) {
        return 0; …
Run Code Online (Sandbox Code Playgroud)

compareto java-7

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

如何编写比较对象的compareTo方法?

我正在学习数组,基本上我有一个收集姓氏,名字和分数的数组.

我需要编写一个compareTo方法来比较姓氏和名字,以便列表可以按字母顺序从姓氏开始排序,然后如果两个人的姓氏相同,那么它将对第一个名称进行排序.

我很困惑,因为我书中的所有信息都是比较数字,而不是对象和字符串.

这是我到目前为止编码的内容.我知道这是错的,但它至少解释了我认为我在做什么:

public int compare(Object obj) // creating a method to compare 
{   
    Student s = (Student) obj; // creating a student object

    // I guess here I'm telling it to compare the last names?
    int studentCompare = this.lastName.compareTo(s.getLastName()); 

    if (studentCompare != 0)
        return studentCompare;
    else 
    {
        if (this.getLastName() < s.getLastName())
            return - 1;

        if (this.getLastName() > s.getLastName())
            return 1;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道<>符号是错误的,但就像我说我的书只告诉你如何使用compareTo.

java compareto comparable

29
推荐指数
2
解决办法
15万
查看次数

未记载的String.compareTo(null)NPE?

以下小测试抛出NPE:

public class Test {

    public static void  main(String[] args) {

        String a = "a";
        String b = null;

        System.out.println(a.compareTo(b));

    }

}
Run Code Online (Sandbox Code Playgroud)

然而,compareTo()的Javadoc 没有提到参数不能null.这很奇怪,因为Javadocs通常会提到参数不可用的时候null.

这只是文档中的一个小故障还是有一个更基本的原因/扭曲我错过了?

java string null compareto

25
推荐指数
1
解决办法
7392
查看次数

如何在Java中使用Comparable CompareTo on Strings

我可以使用它按emp id排序,但我不确定是否可以比较字符串.我得到一个错误,操作符未定义为字符串.

public int compareTo(Emp i) {
            if (this.getName() == ((Emp ) i).getName())
                return 0;
            else if ((this.getName()) > ((Emp ) i).getName())
                return 1;
            else
                return -1;
Run Code Online (Sandbox Code Playgroud)

java compareto comparable

22
推荐指数
3
解决办法
8万
查看次数