当您创建不同的数组时(即使内容相同),contains将返回false。
然而,如果您这样做:
List<String[]> action = new ArrayList<String[]>();
String[] items = new String[]{"apple","ball"};
action.add(items);
if (action.contains(items))
System.out.println("Yes");
这将打印出
Yes。此外,以下是一些行为示例:
String[] items = new String[]{"apple","ball"};
action.add(items);
String[] clone = items.clone();
String[] mirror = items;
action.contains(clone);
action.contains(mirror);
items[0]="horse";
System.out.println(mirror[0]);
System.out.println(clone[0]);
System.out.println(action.get(0)[0]);
mirror[1]="crazy";
System.out.println(clone[1]);
System.out.println(action.get(0)[1]);
System.out.println(items[1]);
clone[1]="yolo";
System.out.println(action.get(0)[1]);
System.out.println(items[1]);
System.out.println(mirror[1]);
System.out.println(action.get(0).hashCode());
System.out.println(items.hashCode());
System.out.println(clone.hashCode());
System.out.println(mirror.hashCode());
自定义 "contains
"
问题在于,如果之后想要搜索特定的数组,您将会失去引用,并且无法搜索项,即使使用完全相同的值复制数组也不行。
作为解决方法,您可以实现自己的contains
方法。例如:
如果您希望获取索引:
static int indexOfArray(List<String[]> list, String[] twin)
{
for (int i=0;i<list.size();i++)
if (Arrays.equals(list.get(i),twin))
return i;
return -1;
}
然后,像这样调用:
String[] toSearch = new String[]{"apple","ball"};
int index = indexOfArray(action, toSearch);
if (index>0)
System.out.println("Array found at index "+index);
else
System.out.println("Array not found");
如果索引大于-1,您可以通过以下方式获取原始数组:
String[] myArray = action.get(index);
HashMap + 标识符
另一种方法是为每个数组声明一个标识符,将它们存储到 HashMap
中。例如:
Base64 ID
这将为相同的值给出相同的结果,因为编码值基于条目,而不是对象的引用。
static String getIdentifier(String[] array)
{
String all="";
for (String s : array)
all+=s;
return Base64.getEncoder().encodeToString(all.getBytes());
}
然后您可以:
Map<String, String[]> arrayMap= new HashMap<>();
String[] items = new String[]{"apple","pear", "banana"};
action.add(items);
arrayMap.put(getIdentifier(items), items);
String[] toSearch = new String[]{"apple","pear", "banana"};
System.out.println(action.contains(toSearch));
String arrId = getIdentifier(toSearch);
System.out.println(action.contains(arrayMap.get(arrId)));
名称.
选择一个代表性的名称并将其用作标识符。
Map<String, String[]> arrayMap= new HashMap<>();
String[] items = new String[]{"apple","pear", "banana"};
action.add(items);
arrayMap.put("fruits", items);
System.out.println(action.contains(arrayMap.get("fruits")));
List<List<String>>
或将数组包装在一个类中,该类使用java.util.Arrays.equals
和java.util.Arrays.hashCode
作为其自己的 equals 和 hashCode 方法。 - Hovercraft Full Of Eels