Java中使用double值进行比较的CompareTo方法

5

我需要能够通过整体健康得分重新排列一组人。我可以使用比较整数的compareTO方法,但当涉及到双精度时,就会出现错误。

public double compareTo(FitnessScore o){
    return (this.overall-o.overall);
}

需要使用double类型,因为有以下分数:

68.5 68.4 60.1 60.3

将它们转换为整数会使其变得多余。当我将其作为整数时,为了测试它是否有效,我尝试了以下操作(subjects是我初始化以保存所有不同人员实例的数组)。

Arrays.sort(subjects);

我遇到了以下错误:

java.lang.NullPointerExceptione

有什么建议吗?

https://dev59.com/nW855IYBdhLWcg3wnFtO - Engineer2021
4
请使用 Double.compare 方法。参考文档:http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#compare%28double,%20double%29 - NeplatnyUdaj
你能提供更多的代码吗?Arrays.sort(subjects) subjects是一个数组吗?它已经被初始化了吗? - Arash Saidi
6个回答

14

你的compareTo方法必须始终返回一个int值。

-1代表在集合中放置在前面
0表示集合中已经存在相同的值
+1代表在集合中放置在后面

如果overallDouble类型,请使用以下内容:

public int compareTo(FitnessScore o){
    return this.overall.compareTo(o.overall));
}

如果 overall 的类型是 double,使用以下代码:

public int compareTo(FitnessScore o){
    if(this.overall<o.overall)
          return -1;
    else if(o.overall<this.overall)
          return 1;
    return 0;
}

对于你的NullPointerException,请检查你的subjects不是null。


但是你的方法返回一个双精度浮点数。并且不是-1或+1。它可以是负数、零或正数。 - JB Nizet
@JBNizet 感谢指出,忘记纠正了。 - Aditya
@Aditya 我仍然不确定空指针异常。我已经加入了一个try和catch,它只是忽略并继续处理信息。所有我的数字都在那里,所以有没有什么方法可以解决它,还是我应该放弃它? - Softey
@Softey请发布更多的代码,并展示您的错误日志。 - Aditya
@Aditya,我已经解决了。有一个无效的空值混进去了。我的旧代码现在可以工作了。不管怎样,还是谢谢你的回答。 - Softey

7
您正在破坏compareTo方法的签名。它应该像下面这样,
public int compareTo(FitnessScore o){
    return Double.compare(this.overall-o.overall);
}

1
你需要实现Comparator接口。不用担心你的值。即使compare方法返回int,这个int也不是你的值之一。
另外,请查看此链接。 具有double类型的比较器

0
你可以试试这个。
Double obj1 = this.overall;
Double obj2 = o.overall;

int retval =  obj1.compareTo(obj2);

//然后执行您的正常if else块。


0

你应该实现一个 Comparator 接口:

class OFSComparator implements Comparator<Member> {
   public int compare(Member m1, Member m2) {
      return (m1.ofs.compareTo(m2.ofs));
   }
}

每个成员都应该有一个总体健康评分字段。
Double ofs;

如果你之后想要基于成员的总体适应度得分进行排序,可以使用 Arrays.sort

Arrays.sort(members, new OFSComparator());

0

你的 compareTo() 方法接收一个 FitnessScore 对象。然而,它没有测试 null 的情况。

onull 时,你的方法会抛出一个 NullPointerException 异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接