Java 检查列表是否正确的最佳方法<;字符串[]>;包含字符串[]
我有一个Java 检查列表是否正确的最佳方法<;字符串[]>;包含字符串[],java,arrays,string,collections,Java,Arrays,String,Collections,我有一个列表声明为: List<String[]> arrayList = new ArrayList<>(); 有没有更好的方法来检查ArrayList是否包含特定的字符串[]?是目前最有效的方法。该方法仅用于此目的,并且优化程度与它在单个for循环的实现中一样低 试试看。我可能会寻找一种解决方案,不直接在列表中存储String[]对象。这可能意味着创建某种有意义的类,可以在内部存储字符串[],也可能意味着切换到ArrayList而不是arrays。但是,在不了解上下
列表
声明为:
List<String[]> arrayList = new ArrayList<>();
有没有更好的方法来检查ArrayList
是否包含特定的字符串[]
?是目前最有效的方法。该方法仅用于此目的,并且优化程度与它在单个for
循环的实现中一样低
试试看。我可能会寻找一种解决方案,不直接在列表中存储
String[]
对象。这可能意味着创建某种有意义的类,可以在内部存储字符串[]
,也可能意味着切换到ArrayList而不是arrays。但是,在不了解上下文的情况下,我能建议的最好方法是使用
ArrayList.contains
不会比您当前所做的更快,而且所有的数组.asList
调用可能会非常冗长,但是HashSet.contains
可能比您现在所做的要快得多。被数组列表打破,所以为什么不使用列表列表列表呢
您可以轻松地使用将数组转换为列表
String[]数组=新字符串[2];
数组[0]=“item1”;
数组[1]=“item2”;
List arrayList=新建arrayList();
add(Arrays.asList(array));
我同意Rod_Algonquin的答案,但还有另一种方法。只需编写自己的类包装数组,并实现一个自定义equals和hashCode方法,让它们返回array.equals()和array.hashCode()。使用这种方法,您可以将对象存储在列表中,并直接对列表进行包含检查
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());
}
}
看起来不错。当前的方法有什么问题?
arrayList.contains(myStringArray)
@bigdestropher这不起作用。我同意@sᴜʀᴇsʜᴀᴛᴛᴀ - 如果(!Arrays.equals())确实要对equals求反吗?这是真的,因为您将相同的引用传递给了添加的字符串数组。尝试使用相同内容的array
Yes创建一个新数组,并传递另一个具有相同元素的数组实例将返回false
(但也应返回true
)!在我看来,这不是一个回应,它不会给当前的帖子增加任何价值。如果你把它作为评论添加到这个问题上就足够了…@user503413-1??当OP问我最好的方法时,我只是说现在的方法是最好的方法。这就像是一个“是/或”的问题。好主意,但如果你用集合而不是列表,让ArrayRapper
缓存它的hashCode
,不是更好吗?@Yogu取决于OP的需要。他说他有一个列表,所以他可能需要按索引获取元素。缓存哈希代码只有在数组从未被修改的情况下才会起作用。
// Make a List that uses the provided array for its contents:
List<String> stringList = Arrays.asList(stringArray);
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));
String[] array = new String[2];
array[0] = "item1";
array[1] = "item2";
List<List<String>> arrayList = new ArrayList<List<String>>();
arrayList.add(Arrays.asList(array));
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