10

在这样的测试中:

    @Test
    public void test() {
        List<String[]> l = new LinkedList<String[]>();
        l.add(new String [] {"test", "123"});
        l.add(new String [] {"test", "456"});
        l.add(new String [] {"test", "789"});

        assertEquals(3, l.size());

        l.remove(new String [] {"test", "456"});

        assertEquals(2, l.size());
    }

第二个断言(= 2)失败,因为equals/hashcode使用的list.removedefaultfor 对象。有没有办法让列表能够用来Arrays.equals/Arrays.hashcode比较数组?或者唯一的解决方案是将字符串数组包装在一个对象中并覆盖equals/hashcode

4

4 回答 4

6

使用番石榴,有。您将需要实现Equivalence<String[]>

public final class MyEquivalence
    extends Equivalence<String[]>
{
    @Override
    protected boolean doEquivalent(final String[] a, final String[] b)
    {
        return Arrays.equals(a, b);
    }

    @Override
    protected int doHash(final String[] t)
    {
        return Arrays.hashCode(t);
    }
}

然后,您需要将列表设置为,并使用您的方法List<Equivalence.Wrapper<String[]>>插入/删除/等:Equivalence.wrap()

final Equivalence<String[]> eq = new MyEquivalence();
list.add(eq.wrap(oneValue));
list.remove(eq.wrap(anotherValue));

使用番石榴。跟着我重复。使用番石榴:p

于 2013-06-20T07:11:14.190 回答
4

您正在创建一个新的 Object 引用并将其传递给remove()方法。从您发布的数据来看,您似乎可以创建一个具有两个属性的自定义类并覆盖它equals()hashCode()而不是将它们存储为String[]OR 保留对String[]插入的对象的引用并使用该引用来删除。

于 2013-06-20T07:09:03.140 回答
2

该方法List通常基于默认比较对象引用的方法。如果您想稍后删除它,您可以存储选项卡,或者创建自己的类并覆盖;)Objectequals(Object o)equals(Object o)

    @Test
    public void test() {
        List<String[]> l = new LinkedList<String[]>();
        l.add(new String [] {"test", "123"});
        String[] tab = new String [] {"test", "456"};
        l.add(tab);
        l.add(new String [] {"test", "789"});

        assertEquals(3, l.size());

        l.remove(tab);

        assertEquals(2, l.size());
    }
于 2013-06-20T07:09:55.643 回答
0

顺便说一句,Java 8 引入了一个新的removeIf方法,该方法删除该集合中满足给定谓词的所有元素

它可用于轻松地从列表中删除字符串数组:

List<String[]> l = new LinkedList<String[]>();
l.add(new String [] {"test", "123"});
l.add(new String [] {"test", "456"});
l.add(new String [] {"test", "789"});

String[] newArray = new String[] {"test", "456"};
l.removeIf(array -> Arrays.equals(array, newArray));
于 2018-02-06T23:58:26.447 回答