繁体   English   中英

使用retainAll()查找hashmap之间的交集

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM