我想在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;
}