我有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}}?
答案 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);
这为您提供了有用的hashCode
和equals
方法,如果主要关注的是遏制测试,则可以使用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));