Java code to Prevent duplicate pairs in HashMap/HashTable

前端 未结 7 1954
梦谈多话
梦谈多话 2021-01-17 02:32

I have a HashMap as below (assuming it has 10,0000 elements)

HashMap hm = new HashMap();
hm.put(\

相关标签:
7条回答
  • 2021-01-17 02:42
    List<String> keys = new ArrayList<String>(); (1000000)
    List<String> values = new ArrayList<String>(); (1000000)
    Map<String, String> map = new HashMap<String, String>();
    int i =0;
    for(String key : keys){
      String returnedValue = map.put(key, values.get(i));
      if(returnedValue!=null){
             map.put(key, returnedValue);
             system.out.println("Duplicate key trying to be entered with new value so   reverting the duplicate key ="+key+"new Value"+values.get(i));
      }
    }
    
    0 讨论(0)
  • 2021-01-17 02:44

    You can wrap HashMap in a class, which delegates put, get, and other methods you use from HashMap. This method is wasteful but safe, since it doesn't depend on the internal implementation of HashMap, AbstractMap. The code below illustrates put, get delegating:

        public class Table {
           protected java.util.HashMap<String, Integer> map = 
                 new java.util.HashMap<String, Integer>();
    
           public Integer get(String key) { return map.get(key); }
    
           public Integer put(String key, Integer value) {
              if (map.containsKey(key)) {
               // implement the logic you need here.
               // You might want to return `value` to indicate
               // that no changes applied
               return value;
              } else {
                return map.put(key, value);
              }
           }
           // other methods goes here
        }
    

    Another option is to make a class which extends HashMap, and depend on its internal implementation. Java 1.6 sources shows that put is called only in putAll in HashMap, so you can simply override put method:

        public class Table extends java.util.HashMap<String, Integer> {
           public Integer put(String key, Integer value) {
              if (containsKey(key)) {
               // implement the logic you need here.
               // You might want to return `value` to indicate
               // that no changes applied
               return value;
              } else {
                return super.put(key, value);
              }
           }
        }
    

    Another option is similar to the first, and can make an utility method in your class which contains the HashMap instance and call that method wherever you need put something to your map:

    public final Integer putToMap(String key, String value) {
       if(this.map.containsKey(key)) {
          return value;
       } else {
          return this.map.put(key, value);
       }
    }
    

    This is an "inline" equivalent of checking manually.

    0 讨论(0)
  • 2021-01-17 02:45
    List<Object> yourElements = new ... // 10000000
    for(Object O : yourElements) {
     if(myMap.get(O.key)==null) {
        myMap.put(O.key,O);
     }
    }
    
    0 讨论(0)
  • 2021-01-17 02:51

    see even if u write same key values multiple times you will just have unique set of pairs. Check that by either iterating or by doing hm.size();

    0 讨论(0)
  • 2021-01-17 03:00

    This may be old question but I thought to share my experience with this. As others pointed out you can't have the same element in a HashMap. By default HashMap will not allow this but there are some cases that you could end up with two or more elements are almost alike that you do not accept but HashMap will. For example, the following code defines a HashMap that takes an array of integers as a key then add :

    HashMap<int[], Integer> map1 = new HashMap<>();
    int[] arr = new int[]{1,2,3};
    map1.put(arr, 4);
    map1.put(arr, 4);
    map1.put(arr, 4);
    

    At this point, the HashMap did not allow dublicating the key and map1.size() will return 1. However, if you added elements without creating the array first things will be different:

    HashMap<int[], Integer> map2 = new HashMap<>();
    map2.put(new int[]{4,5,6}, 6);
    map2.put(new int[]{4,5,6}, 6);
    map2.put(new int[]{4,5,6}, 6);
    

    This way, the HashMap will add all the three new elements so the map2.size() will return 3 and not 1 as expected.

    The explanation is that with the first map I created the object arr once and tried to add the same object 3 times which HashMap does not allow by default so only the last usage will be considered. With the second map, however, evey time I recreate a new object on the stack. The three objects created are different and separated thought the three of them have the same data but they are different. That's why HashMap allowed them as different keys.

    Bottom line, you don't need to prevent HashMap from adding dublicated keys because it won't by design. However, you have to watch out how you define these keys because the fault may be on your side.

    0 讨论(0)
  • 2021-01-17 03:02
    if(hm.put("John","1") != null)
    {
      // "John" was already a key in the map.  The sole value for this key is now "1".
    }
    
    0 讨论(0)
提交回复
热议问题