Java HashMap - Как одновременно получить, а затем удалить случайную запись из HashMap? - PullRequest
0 голосов
/ 11 ноября 2018

Мне было интересно, возможно ли получить случайное значение из HashMap, а затем сразу же удалить этот ключ / значение из HashMap? Я не могу найти какой-либо метод, который работает, будет ли другая структура данных более подходящей для этого?

Edit: Я должен был быть более ясным, я генерирую случайное число, а затем извлекаю значение, соответствующее этому случайному числу. Мне нужно вернуть значение, а затем удалить запись с карты.

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

Я бы сделал это так:

Hashmap<Integer, Object> example;
int randomNum = ThreadLocalRandom.current().nextInt(0, example.size());
example.getValue() //do something
example.remove(new Integer(randomNum));
0 голосов
/ 11 ноября 2018

Проблема, насколько я понимаю, заключается в следующем: при HashMap вы хотите

  1. Выберите произвольно выбранный ключ из числа ключей, которые в настоящее время связаны с Map;
  2. Удалить эту ассоциацию этого случайно выбранного ключа с карты; и
  3. Возвращает значение, которое до недавнего времени ассоциировалось с этим ключом

Вот пример того, как это сделать, вместе с небольшой тестовой / демонстрационной процедурой:

public class Main
{
    private static <K, V> V removeRandomEntry(Map<K, V> map){
        Set<K> keySet = map.keySet();
        List<K> keyList = new ArrayList<>(keySet);
        K keyToRemove = keyList.get((int)(Math.random()*keyList.size()));
        return map.remove(keyToRemove);
    }

    public static void main(String[] args){
        Map<String, String> map = new HashMap<>();
        for(int i = 0; i < 100; ++i)
            map.put("Key" + i, "Value"+i);
        int pass = 0;
        while (!map.isEmpty())
            System.out.println("Pass " + (++pass) + ": Removed: " + removeRandomEntry(map));
    }
}
0 голосов
/ 11 ноября 2018

Может быть Map#computeIfPresent будет работать в вашем случае. Из документации :

Если значение для указанного ключа присутствует и не равно нулю, попытка вычислить новое сопоставление, учитывая ключ и его текущее сопоставленное значение.

Если функция переназначения возвращает ноль, отображение удаляется.

var map = new HashMap<Integer, String>();

map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");

map.computeIfPresent(2, (k, v) -> {
    // `v` is equal to "Two"
    return null; // Returning `null` removes the entry from the map.
});

System.out.println(map);

Приведенный выше код выводит следующее:

{1=One, 3=Three}

Если бы вы использовали ConcurrentHashMap, то это была бы атомарная операция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...