【问题标题】:Comparator interface used to compare doubles用于比较双精度数的比较器接口
【发布时间】:2020-12-02 03:17:09
【问题描述】:

我正在使用比较器接口来比较自定义对象以对 ArrayList 进行排序。这适用于 int 和 String 值,但是当我想对双精度进行排序/比较时,我遇到了麻烦。

我知道 Java 在我的方法中四舍五入并将 1.7、1.62、1.66 读取为 1,这是错误。

但我似乎无法找到解决此问题的方法。这是我的方法和结果 - 结果表明,由于将 double 转换为 int,Comparator 无法正确排序列表。

请注意,我的“赔率”变量是双倍值,必须在比较器接口中转换为函数:

public Integer getOddsInt() {
        return (int) odds;
    }


public class SortOdds implements Comparator <History>{
    
     public int compare(History a, History b) 
        
        { 
            return a.getOddsInt() - b.getOddsInt(); 
        }
}

结果:

[ 
  2.62 |  
, 1.7  |  
, 1.62 | 
, 1.66 | 
]

【问题讨论】:

    标签: java arraylist type-conversion compare


    【解决方案1】:

    如果这会导致问题,请不要进行转换。只需使用 if-else 逻辑

    if (a.getDouble() < b.getDouble) {
      return -1 ;
    else if (a.getDouble() > b.getDouble){
      return 1 ;
    } else {
      return 0 ;
    }
    

    }

    【讨论】:

    • 'getDouble()' 对于 'getOdds()' 方法来说是一个非常糟糕的名称。此外,您正在重新发明轮子; Double.compare(a.getOdds(), b.getOdds()) 可以完成这项工作,更不容易出错,更短,更惯用。
    • 这只是快速编码,而不是试图在我的答案中制作干净的代码:-P(现在我发现我在很多地方都没有得到括号)
    【解决方案2】:

    您似乎有点困惑——如果您想在 1.6 之前排序 1.4,但您对该数据的唯一可能视图只是“1”,那么您想要的显然是不可能的。

    但你是你自己代码的老板。正如医生所说,当女人问:“医生,当我用锤子敲打自己的脸时很痛”:“好吧,那就别那么做了!”。

    创建一个将赔率作为实际双倍返回的方法。或者,如果 SortOdds 类在 History 类中,您可以直接访问该字段,我假设该字段类似于 private final double odds;

    compare 要求您返回一个 int,但您的方法 - 是一个错误的常见比喻。不要那样写你的比较运行,它们不适用于极端值。

    你真的无法摆脱:

    if (a.getOdds() < b.getOdds()) return -1;
    if (a.getOdds() > b.getOdds()) return +1;
    return 0;
    

    但幸运的是,Double.compare(a, b) 方法正是这样做的。所以...:

    return Double.compare(a.odds, b.odds);

    就是你所需要的。

    注意:这些天你可以让这些东西变得更容易:

    public class History {
        public static final Comparator<History> ODDS_BASED_COMPARATOR =
          Comparator.comparingDouble(History::getOdds);
    
        private final double odds;
    
        public double getOdds() { return odds; }
    }
    
    // and to use, for example:
    
    List<History> list = new ArrayList<History>();
    // add some history objects to it here
    list.sort(History.ODDS_BASED_COMPARATOR);
    

    【讨论】:

    • 感谢您提供非常有帮助的答案。我还是 Java 新手,这是我第一次使用 Comparater。你的回答解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多