[英]Find the intersection between hashmaps using retainAll()
我需要找到值是字符串数组的 2 个哈希映射之间的交集,似乎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());
retainAll()
方法使用它们的equals()
retainAll()
方法比较对象,在数组的情况下比较它们的身份。 entry 对象只是在它的 equals 方法中调用键和值的 equal 方法,因此只调用数组的 equal 方法,这并不像人们期望的那样工作。 有多种方法可以解决这个问题:
一种方法是使用在这里的andersoj answer 中描述的 Guanva 过滤器。
另一种方法是为您的字符串数组创建一个包装类,该类覆盖此包装的 equals 方法以逐个元素比较两个数组。 这也在Ralph对与之前相同问题的回答中有所描述。
如果您想绕过包装器,您也可以使用列表,因为它们的 equals 方法是按照您的预期实现的。 如果两个列表以相同的顺序包含相同的元素,它将返回 true。
可以包装数组:
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]]
但通常情况下,您会希望通过键与地图相交,例如此处。
尝试使用这个
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.