我需要找到两个哈希映射之间的交集,其中值是一个String数组,似乎retainAll()按地址比较数组,有没有办法让retainAll()以我预期的方式工作?
String[] aa={"aa"};
String[] bb={"aa"};
Map<String, String[]> requestParameters=new HashMap<String, String[]>();
requestParameters.put("A",aa);
Map<String, String[]> redirectParameters=new HashMap<String, String[]>();
redirectParameters.put("A",bb);
Map<String, String[]> intersectionMap = new HashMap<>(requestParameters);
intersectionMap.entrySet().retainAll(redirectParameters.entrySet());
System.out.println(""+ intersectionMap.entrySet());
答案 0 :(得分:1)
retainAll()
方法使用equals()
方法比较对象,在数组的情况下比较它们的身份。入口对象只调用its equals method中的键和值相等的方法,因此只调用数组相等的方法,这种方法并不像人们期望的那样工作。有多种方法可以解决这个问题:
一种方法是使用andersoj answer Guanva's filter中描述的here。
另一种方法是为字符串数组创建一个包装类,它覆盖此包装器的equals方法,以逐个元素地比较两个数组。这也在answer by Ralph中描述了与之前相同的问题。
如果你想绕过包装器,你也可以使用列表,因为their equals method是按照你的预期实现的。如果两个列表包含相同顺序的相同元素,它将返回true。
答案 1 :(得分:0)
可以包装数组:
import java.util.*;
class Test {
private static class StringArrayWrapper {
private String[] data;
public String[] getArray() {
return data;
}
public StringArrayWrapper(String[] data) {
this.data = data;
}
public boolean equals(Object other) {
return (other instanceof StringArrayWrapper) && Arrays.equals(data, ((StringArrayWrapper)other).data);
}
public String toString() {
return Arrays.toString(data);
}
public int hashCode() {
return Arrays.hashCode(data);
}
}
private static StringArrayWrapper wrap(String[] a) {
return new StringArrayWrapper(a);
}
public static void main(String[]args) {
String[] aa={"aa"};
String[] bb={"aa"};
Map<String, StringArrayWrapper> requestParameters=new HashMap<String, StringArrayWrapper>();
requestParameters.put("A", wrap(aa));
Map<String, StringArrayWrapper> redirectParameters=new HashMap<String, StringArrayWrapper>();
redirectParameters.put("A", wrap(bb));
Map<String, StringArrayWrapper> intersectionMap = new HashMap<>(requestParameters);
intersectionMap.entrySet().retainAll(redirectParameters.entrySet());
System.out.println(""+ intersectionMap.entrySet());
}
}
打印:
[A=[aa]]
但通常情况下,您希望按键交叉地图,例如here。
答案 2 :(得分:0)
尝试使用此
static void intersection(String[]...inputArrays){
HashSet<String> intersectionSet = new HashSet<>(Arrays.asList(inputArrays[0]));
int a=0;
for (int i = 1; i< inputArrays.length;i++){
HashSet<String> set = new HashSet<>(Arrays.asList(inputArrays[i]));
intersectionSet.retainAll(set);
}
System.out.println("======================");
System.out.println("Interseksi nya");
System.out.println("======================");
System.out.println(intersectionSet);
}
public void test(){
String[] inputArray1 = { "aku","kamu","dia","mereka"};
String[] inputArray2 = {"dia","saya","mereka","aku"};
String[] inputArray3 = {"aku","mereka","kita","dia"};
intersection(inputArray1,inputArray2,inputArray3);
}