Is there a way to get the value of a HashMap randomly in Java?

前端 未结 13 2155
心在旅途
心在旅途 2020-11-30 03:45

Is there a way to get the value of a HashMap randomly in Java?

13条回答
  •  半阙折子戏
    2020-11-30 04:10

    If you are fine with O(n) time complexity you can use methods like values() or values().toArray() but if you look for a constant O(1) getRandom() operation one great alternative is to use a custom data structure. ArrayList and HashMap can be combined to attain O(1) time for insert(), remove() and getRandom(). Here is an example implementation:

    class RandomizedSet {
        List nums = new ArrayList<>();
        Map valToIdx = new HashMap<>();
        Random rand = new Random();
    
        public RandomizedSet() { }
    
        /**
         * Inserts a value to the set. Returns true if the set did not already contain
         * the specified element.
         */
        public boolean insert(int val) {
            if (!valToIdx.containsKey(val)) {
                valToIdx.put(val, nums.size());
                nums.add(val);
                return true;
            }
            return false;
        }
    
        /**
         * Removes a value from the set. Returns true if the set contained the specified
         * element.
         */
        public boolean remove(int val) {
            if (valToIdx.containsKey(val)) {
                int idx = valToIdx.get(val);
                int lastVal = nums.get(nums.size() - 1);
    
                nums.set(idx, lastVal);
                valToIdx.put(lastVal, idx);
    
                nums.remove(nums.size() - 1);
                valToIdx.remove(val);
                return true;
            }
            return false;
        }
    
        /** Get a random element from the set. */
        public int getRandom() {
            return nums.get(rand.nextInt(nums.size()));
        }
    }
    

    The idea comes from this problem from leetcode.com.

提交回复
热议问题