检查List <string []>是否包含String [] </string []>的最佳方法

时间:2014-08-21 07:01:55

标签: java arrays string collections

我有List声明为:

List<String[]> arrayList = new ArrayList<>();

List包含多个String s。

数组

我需要检查String[]中是否包含ArrayList<String[]>

我目前正在遍历ArrayList并将每个String[]与我正在搜索的for(String[] array: arrayList){ if(Arrays.equals(array, myStringArray)){ return true; } } return false; 进行比较:

ArrayList<String[]>

有没有更好的方法来检查String[]是否包含特定的{{1}}?

4 个答案:

答案 0 :(得分:9)

Array.equals()是最有效的方法 afaik 。该方法仅用于此目的,并且在current state实现(即单个for循环)中进行优化。

去吧。

答案 1 :(得分:6)

我同意Rod_Algonquin的答案,但还有另一种方法可以做到。只需编写自己的包装数组的类并实现自定义的equals和hashCode方法,并让它们返回Arrays.equals()和Arrays.hashCode()。使用这种方法,您可以将对象存储在List中,并直接对列表进行检查。

List<ArrayWrapper> list = new ArrayList<ArrayWrapper>();
list.add(new ArrayWrapper(new String[]{"test", "123"}));
list.add(new ArrayWrapper(new String[]{"abc", "def"}));
list.add(new ArrayWrapper(new String[]{"789", "cgf"}));

String[] arrayToSearchFor = {"test", "123"};
ArrayWrapper wrapperToSearchFor = new ArrayWrapper(arrayToSearchFor);
System.out.println(list.contains(wrapperToSearchFor));

String[] arrayToSearchFor2 = {"hello", "123"};
ArrayWrapper wrapperToSearchFor2 = new ArrayWrapper(arrayToSearchFor2);
System.out.println(list.contains(wrapperToSearchFor2));


class ArrayWrapper
{
    private String[] array;

    public ArrayWrapper(String[] array)
    {
        this.array = array;
    }

    public String[] getArray()
    {
        return array;
    }

    @Override
    public int hashCode()
    {
        return Arrays.hashCode(array);
    }

    @Override
    public boolean equals(Object obj)
    {
        if (!(obj instanceof ArrayWrapper))
        {
            return false;
        }

        return Arrays.equals(array, ((ArrayWrapper) obj).getArray());
    }
}

这将打印

true
false

答案 2 :(得分:1)

我可能会寻找一个解决方案,您不能将String[]个对象直接存储在列表中。这可能意味着创建一些可能在内部存储String[]的有意义的类,或者它可能意味着只是切换到ArrayLists而不是数组。但是,在不知道上下文的情况下,我建议的最好的方法是使用Arrays.asList

将它们包含在列表中
// Make a List that uses the provided array for its contents:
List<String> stringList = Arrays.asList(stringArray);

这为您提供了有用的hashCodeequals方法,如果主要关注的是遏制测试,则可以使用ArrayList.contains甚至HashSet

Set<List<String>> stringLists = new HashSet<>();

// when you want to add a String[]:
stringLists.add(Arrays.asList(stringArray));

// when you want to check whether a String[] is in the set:
stringLists.contains(Arrays.asList(stringArray));

ArrayList.contains不会比你目前所做的更快,并且Arrays.asList所有HashSet.contains次来电都可能非常冗长,但{{1}}有可能比你正在做的更快。

答案 3 :(得分:1)

List.contains(Object)打破了数组列表,为什么不使用列表列表呢?

您可以使用Arrays.asList(T... a)轻松将数组转换为列表。

String[] array = new String[2];
array[0] = "item1";
array[1] = "item2";
List<List<String>> arrayList = new ArrayList<List<String>>();
arrayList.add(Arrays.asList(array));