3

我正在尝试删除在List<List<float[]>>. 我试图使用一个不允许重复的集合(HashList),但我无法弄清楚如何正确地转换它。要遍历我将执行的所有元素。

List<List<float[]>> tmp; 

for(int i=0; i<tmp.get(0).size();i++){
    System.out.println(java.util.Arrays.toString(tmp.get(0).get(i)));
}

我想从里面的列表中删除它们。所以在 tmp.get(0).get(Here to remove) 找到的所有元素

tmp.get(0).get(1) =[-70.89,42.12]

tmp.get(0).get(2) =[-70.89,42.12]

我想删除 tmp.get(0).get(2)

当前实现,当只有 1 个重复但没有多个重复时有效。

for(int i=0; i<old.get(0).size();i++){
            if(i == old.get(0).size()-1){
                System.out.println("max size");
                return old;
            }
            else if(Arrays.toString(old.get(0).get(i)).equalsIgnoreCase(Arrays.toString(old.get(0).get(i+1)))){
                old.get(0).remove(i);
                i++;
            } else {
            i++;
            }
4

3 回答 3

3

如果我理解正确,您正在寻找Set<List<float[]>>.

于 2013-09-19T15:05:27.660 回答
1

怎么样:

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();
    }
}

要进行比较,请尝试BigDecimal通过new BigDecimal(double, MathContext)转换为

更新:测试失败。比较 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 的PredicateIterables.any()。这个解决方案比使用 a 效率低,因为它每次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);
            }
        }
    }
    // for (int i = 0; i < old.get(0).size(); i++) {
    // System.out.println(java.util.Arrays.toString(old.get(0).get(i)));
    // }
    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]

于 2013-09-19T15:19:33.493 回答
0

您可以LinkedHashSet在填充时使用没有重复项。虽然它是 的实现,但如果需要方法Set,您可以将其包装到 a中。ListList

于 2013-09-19T15:06:32.500 回答