【问题标题】:Java CompareTO with double Values具有双值的 Java CompareTO
【发布时间】:2014-03-14 21:15:34
【问题描述】:

我需要能够根据他们的整体健康得分重新排列一组人。我可以用整数做一个 compareTO 方法,但是一旦它用双打,我就会到处乱飞。

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

它必须是双倍的,因为有这样的分数:

68.5 68.4 60.1 60.3

因此将它们转换为 int 会使它变得多余。当我确实将它作为 int 来查看它是否可以工作时。我尝试了以下。 (主题是我初始化的数组,用于保存所有不同的人实例)

Arrays.sort(subjects);

我收到以下错误:

java.lang.NullPointerExceptione

有什么建议吗?

【问题讨论】:

标签: java


【解决方案1】:

您的compareTo 必须始终返回int 值。

-1 将其放在 Collection 之前
0 表示 Collection 中已存在相同的值
+1 用于放置之后在 Collection 中

如果overallDouble 类型,使用这个:

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

如果overalldouble 类型,使用这个:

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

对于您的NullPointerException,请检查您的subjects 是否为空。

【讨论】:

  • 但是你的方法返回一个双精度。不是,不是 - 1 或 +1。它是负数、零或正数。
  • @JBNizet 感谢指点,忘记更正了
  • @Aditya 我仍然不确定 NullPointerException。我已经尝试并捕获它只是忽略然后处理信息。我所有的数字都在那里,所以有没有办法对抗它或者我应该离开的东西?
  • @Softey 请发布更多代码并显示您的错误日志。
  • @Aditya 我已经整理好了。 Rogue null 成功了。我的旧代码现在可以工作了。还是谢谢你的回答
【解决方案2】:

您正在破坏 compareTo 方法的签名。 它应该如下所示,

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

【讨论】:

    【解决方案3】:

    您需要实现 Comparator 接口。不要担心你的价值观。即使比较方法返回一个 int。这个 int 不是你的价值观之一。

    也检查一下。 Comparator with double type

    【讨论】:

      【解决方案4】:

      您的compareTo() 方法接收FitnessScore 对象。但是,它不会测试 null 大小写。

      onull 时,您的方法将抛出NullPointerException

      【讨论】:

        【解决方案5】:

        你可以试试这个。

        Double obj1 = this.overall;
        Double obj2 = o.overall;
        
        int retval =  obj1.compareTo(obj2);
        

        //然后执行正常的 if else 阻塞。

        【讨论】:

          【解决方案6】:

          你应该实现一个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());
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-19
            • 2012-07-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多