Как получить несколько случайных ключей из HashMap - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть карта с названиями. Я хочу напечатать 10 случайных ключей из моей хэш-карты.

Например, моя карта (String, Object) содержит 100 пар: "A, new Object (...)", "B, ...", "C, ..." et c.

Я хочу получить 10 случайных ключей с этой карты и добавить к одной строке.

Так что моя строка должна выглядеть так: "A \ nD \ nB".

Ответы [ 5 ]

3 голосов
/ 07 апреля 2020

Быстрый способ получить случайные 10 ключей без повторений - поместить ключи в список и использовать Collections.shuffle для перемешивания списка.

Map<String, Object> map = ...yourmap
ArrayList<String> keys = new ArrayList<>(map.keySet());
Collections.shuffle(keys);
List<String> randomTenKeys = keys.subList(0, 10);

Создание списка всех ключи и перетасовка это не самая эффективная вещь, которую вы можете сделать. Вы можете сделать это за один проход по алгоритму отбора проб из резервуара . Я не рассматривал это, но вы, вероятно, можете найти реализацию в какой-то Apache или библиотеке Guava.

1 голос
/ 07 апреля 2020

Это дополнительный ответ на ответ Джони . Используйте String:join, чтобы присоединиться к randomTenKeys.

. Ниже приведен ответ Джони :

Map<String, Object> map = ...yourmap
ArrayList<String> keys = new ArrayList<>(map.keySet());
Collections.shuffle(keys);
List<String> randomTenKeys = keys.subList(0, 10);

и дополнительный ответ :

String joinedKeys = String.join("\n", randomTenKeys);
1 голос
/ 07 апреля 2020

Ответ Джони довольно хороший и короткий. Но вот полностью рабочий пример, если хотите. Я разделил вашу проблему на два метода - один, чтобы вернуть список случайно выбранных ключей, и другой, чтобы напечатать ключи любым удобным вам способом. Вы можете объединить два метода в один. Но лучше держать их отдельно.

import java.util.*;
import java.util.stream.IntStream;

public class Test {
    public static void main(String [] args){
        Map<String, Object> map = new HashMap<>();
        //You can use for loop instead to make a map of String, Integer. 
        IntStream.rangeClosed(0, 9).forEach(i -> map.put(i +"", i));//Map of 10 numbers.

        List<String> keys = getRandomKeys(map, 3);
        String allKeys = combineKeys(keys, "\n");
        System.out.println(allKeys);
    }

    public static List<String> getRandomKeys(Map<String, Object> map, int keyCount) {
        List<String> keys = new ArrayList<>(map.keySet());

        for(int i = 0; i < map.size()-keyCount; i++){
            int idx = (int) ( Math.random() *  keys.size() );
            keys.remove(idx);
        }
        return keys;
    }

    public static String combineKeys(List<String> keys, String separator){
        String all = "";

        for(int i = 0; i < keys.size() - 1; i++){
            all = all + keys.get(i) + separator;
        }

        all += keys.get(keys.size()-1);//last element does not need separator.

        return all;
    }
}
0 голосов
/ 09 апреля 2020

HashMap Хранит значения уже в несортированном порядке, это случайно. вы можете напрямую использовать

for(Map.Entry entry : map.entrySet())
    str.append(entry.getKey()+" "+entry.getValue());

, однако, если вы хотите новый порядок каждый раз, когда вы можете перетасовать свои данные. Для Shuffle вам нужно получить все ключи в массиве или списке. Затем вы можете перемешать этот список и перебрать этот список, чтобы получить значения из hashmap

0 голосов
/ 07 апреля 2020
Set<String> keys = myMap.keySet();
String combined = "";
for (int i=0; i<10; i++)
{
   int random = (int)(Math.random() * keys.size());
   String key = keys.get(random);
   combined += key + "\n";
   keys.remove(random);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...