如何正确删除浮动列表?

时间:2016-03-02 07:43:13

标签: java floating-point

我想在specifying an appropriate epsilon for precision时删除Floats列表。

在我意识到存在很多陷阱之前,我开始写这个解决方案。例如,该解决方案存在例如装箱的问题。如果我将epsilon设置为1.0而我的输入为{0.9, 1.0, 2.0, 3.0},则会获得{0.9, 2.0}。但是,如果我的输入为{1.0, 2.0, 3.0},则会获得{1.0, 3.0}

另一个问题是,目前还不清楚处理NaN,infinity,-0.0f等值的最佳方法是什么,因此这个函数适用于许多一般用例(也许应该有一个可选的参数来定制这个行为?)。

我确信还有其他角落案例。

// Suffers from binning issues
public static List<Float> dedup(List<Float> floats, float epsilon) {
    List<Float> sortedFloats = new ArrayList<Float>();
    sortedFloats.addAll(floats);
    Collections.sort(sortedFloats);

    List<Float> dedupedList = new ArrayList<Float>();
    for (Float f : sortedFloats) {
        if (dedupedList.size() == 0) {
            dedupedList.add(f);
        } else {
            Float previousValue = dedupedList.get(dedupedList.size() - 1);
            if (Math.abs(previousValue - f) >= epsilon) {
                dedupedList.add(f);
            }
        }
    }
    return dedupedList;
}

0 个答案:

没有答案