Java 如何正确地消除浮动列表的重复?

Java 如何正确地消除浮动列表的重复?,java,floating-point,Java,Floating Point,我想在执行时对浮动列表进行重复数据消除 这是我在意识到有这么多陷阱之前就开始写的解决方案。例如,此解决方案在装箱方面存在问题,例如,如果我将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等值的最佳方法是什么。因此,该函数在许多通用用例中都可以工作(也许应该有一个自定义此行为的可选参数?) 我相信还有

我想在执行时对
浮动
列表进行重复数据消除

这是我在意识到有这么多陷阱之前就开始写的解决方案。例如,此解决方案在装箱方面存在问题,例如,如果我将
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;
}
//存在装箱问题
公共静态列表重复数据消除(列表浮动、浮动ε){
List sortedFloats=new ArrayList();
分类浮动。添加所有(浮动);
收集.分类(分类贷款);
List dedupledList=新建ArrayList();
用于(浮子f:分拣浮子){
如果(重复数据列表.size()==0){
重复数据列表。添加(f);
}否则{
Float previousValue=dedupledList.get(dedupledList.size()-1);
if(Math.abs(previousValue-f)>=epsilon){
重复数据列表。添加(f);
}
}
}
返回重复数据列表;
}

可能会帮助bitI建议使用BigDecimal而不是float。关于浮点运算,您还需要了解以下内容:@YoussefLahoud,但在这种情况下可能没有任何区别。我建议您将浮点值添加到一个树集,该树集具有一个比较器,该比较器将ε内的值视为相等,因此将被删除。这是一个O(N logn)操作。@彼得拉维这样的比较器能满足强制执行总订单的要求吗?你可以有
a.compareTo(b)==0
b.compareTo(c)==0
,而
a.compareTo(c)
不为零。