怎么样:
List<List<Float[]>> outterList;
Set<Float[]> mySet = new HashSet<Float[]>();
for (List<Float[]> innerList : outterList){
Iterator<Float[]> iterator = innerList.iterator();
while(iterator.hasNext()){
Float[] array = iterator.next();
boolean added = mySet.add(array);
if (!added)
iterator.remove();
}
}
为了进行比较,请尝试通过
new BigDecimal(double, MathContext) 转换为
BigDecimal
更新:
测试失败。似乎在 HashSet 中比较数组存在问题。
@Test
public void testArrays() {
Set<String[]> set = new HashSet<String[]>();
set.add(new String[] { "12.3f", "33.4f" });
Assert.assertFalse(set.add(new String[] { "12.3f", "33.4f" }));
}
更新
所以数组的工作方式不同。以下是详细说明:
这里使用了Guava的Predicate和Iterables.any()。与使用Set
相比,此解决方案效率较低,因为它每次都必须迭代List
,但如果性能不是问题,则可以使用它。
private static <T> Predicate<T[]> equals(final T[] array) {
return new Predicate<T[]>() {
@Override
public boolean apply(T[] arg0) {
return Arrays.equals(array, arg0);
}
};
}
public static <T> List<List<T[]>> ProcessList(List<List<T[]>> old) {
List<T[]> mySet = new ArrayList<T[]>();
for (List<T[]> innerList : old) {
Iterator<T[]> iterator = innerList.iterator();
while (iterator.hasNext()) {
T[] array = iterator.next();
Predicate<T[]> contains = equals(array);
if (Iterables.any(mySet, contains)) {
iterator.remove();
} else {
mySet.add(array);
}
}
}
return old;
}
这个测试:
@Test
public void testListsFloat() {
List<List<Float[]>> outter = new ArrayList();
List<Float[]> inner1 = new ArrayList();
inner1.add(new Float[] { 12.3f, 33.4f });
inner1.add(new Float[] { 12.2f, 33.2f });
inner1.add(new Float[] { 12.3f, 33.4f });
List<Float[]> inner2 = new ArrayList();
inner2.add(new Float[] { 12.1f, 33.1f });
inner2.add(new Float[] { 12.2f, 33.2f });
inner2.add(new Float[] { 12.3f, 33.4f });
outter.add(inner1);
outter.add(inner2);
outter = ProcessList(outter);
for (List<Float[]> list : outter) {
for (Float[] array : list) {
System.out.println(Arrays.toString(array));
}
}
}
这导致了以下输出结果:
[12.3, 33.4]
[12.2, 33.2]
[12.1, 33.1]
List<float[]>
吗? - Sotirios Delimanolis