Map implementation with duplicate keys

后端 未结 18 1731
暗喜
暗喜 2020-11-22 15:23

I want to have a map with duplicate keys.

I know there are many map implementations (Eclipse shows me about 50), so I bet there must be one that allows this. I know

相关标签:
18条回答
  • 2020-11-22 15:56

    I used this:

    java.util.List<java.util.Map.Entry<String,Integer>> pairList= new java.util.ArrayList<>();

    0 讨论(0)
  • 2020-11-22 15:57

    We don't need to depend on the Google Collections external library. You can simply implement the following Map:

    Map<String, ArrayList<String>> hashMap = new HashMap<String, ArrayList>();
    
    public static void main(String... arg) {
       // Add data with duplicate keys
       addValues("A", "a1");
       addValues("A", "a2");
       addValues("B", "b");
       // View data.
       Iterator it = hashMap.keySet().iterator();
       ArrayList tempList = null;
    
       while (it.hasNext()) {
          String key = it.next().toString();             
          tempList = hashMap.get(key);
          if (tempList != null) {
             for (String value: tempList) {
                System.out.println("Key : "+key+ " , Value : "+value);
             }
          }
       }
    }
    
    private void addValues(String key, String value) {
       ArrayList tempList = null;
       if (hashMap.containsKey(key)) {
          tempList = hashMap.get(key);
          if(tempList == null)
             tempList = new ArrayList();
          tempList.add(value);  
       } else {
          tempList = new ArrayList();
          tempList.add(value);               
       }
       hashMap.put(key,tempList);
    }
    

    Please make sure to fine tune the code.

    0 讨论(0)
  • 2020-11-22 15:57

    If you want iterate about a list of key-value-pairs (as you wrote in the comment), then a List or an array should be better. First combine your keys and values:

    public class Pair
    {
       public Class1 key;
       public Class2 value;
    
       public Pair(Class1 key, Class2 value)
       {
          this.key = key;
          this.value = value;
       }
    
    }
    

    Replace Class1 and Class2 with the types you want to use for keys and values.

    Now you can put them into an array or a list and iterate over them:

    Pair[] pairs = new Pair[10];
    ...
    for (Pair pair : pairs)
    {
       ...
    }
    
    0 讨论(0)
  • 2020-11-22 15:58

    Could you also explain the context for which you are trying to implement a map with duplicate keys? I am sure there could be a better solution. Maps are intended to keep unique keys for good reason. Though if you really wanted to do it; you can always extend the class write a simple custom map class which has a collision mitigation function and would enable you to keep multiple entries with same keys.

    Note: You must implement collision mitigation function such that, colliding keys are converted to unique set "always". Something simple like, appending key with object hashcode or something?

    0 讨论(0)
  • 2020-11-22 15:59
    commons.apache.org
    
    MultiValueMap class
    
    0 讨论(0)
  • 2020-11-22 15:59

    With a bit hack you can use HashSet with duplicate keys. WARNING: this is heavily HashSet implementation dependant.

    class MultiKeyPair {
        Object key;
        Object value;
    
        public MultiKeyPair(Object key, Object value) {
            this.key = key;
            this.value = value;
        }
    
        @Override
        public int hashCode() {
            return key.hashCode();
        }
    }
    
    class MultiKeyList extends MultiKeyPair {
        ArrayList<MultiKeyPair> list = new ArrayList<MultiKeyPair>();
    
        public MultiKeyList(Object key) {
            super(key, null);
        }
    
        @Override
        public boolean equals(Object obj) {
            list.add((MultiKeyPair) obj);
            return false;
        }
    }
    
    public static void main(String[] args) {
        HashSet<MultiKeyPair> set = new HashSet<MultiKeyPair>();
        set.add(new MultiKeyPair("A","a1"));
        set.add(new MultiKeyPair("A","a2"));
        set.add(new MultiKeyPair("B","b1"));
        set.add(new MultiKeyPair("A","a3"));
    
        MultiKeyList o = new MultiKeyList("A");
        set.contains(o);
    
        for (MultiKeyPair pair : o.list) {
            System.out.println(pair.value);
        }
    }
    
    0 讨论(0)
提交回复
热议问题