AssertEquals 2 Lists ignore order AssertEquals 2 Lists ignore order arrays arrays

AssertEquals 2 Lists ignore order


As you mention that you use Hamcrest, I would pick one of the collection Matchers

import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;import static org.junit.Assert.assertThat;public class CompareListTest {    @Test    public void compareList() {        List<String> expected = Arrays.asList("String A", "String B");        List<String> actual = Arrays.asList("String B", "String A");        assertThat("List equality without order",             actual, containsInAnyOrder(expected.toArray()));    }}


You can use List.containsAll with JUnit's assertTrue to check that the first list contains every element from the second one, and vice versa.

assertTrue(first.size() == second.size() &&     first.containsAll(second) && second.containsAll(first));


Here's a solution that avoids quadratic complexity (iterating over the lists multiple times). This uses the Apache Commons CollectionUtils class to create a Map of each item to a frequency count itself in the list. It then simply compares the two Maps.

Assert.assertEquals("Verify same metrics series",    CollectionUtils.getCardinalityMap(expectedSeriesList),    CollectionUtils.getCardinalityMap(actualSeriesList));

I also just spotted CollectionUtils.isEqualCollection that claims to do exactly what is being requested here...

https://commons.apache.org/proper/commons-collections/apidocs/index.html?org/apache/commons/collections4/CollectionUtils.html