使用retainAll()查找散列图之间的交集

时间:2016-06-10 15:48:56

标签: java arrays

我需要找到两个哈希映射之间的交集,其中值是一个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());

3 个答案:

答案 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);
    }

enter image description here