Существует ли способ получить значение HashMap случайным образом в Java?

Чистый способ выглядит следующим образом:

http://developer.android.com/guide/topics/ui/dialogs.html

Выдержка из ( Добавление постоянного списка с несколькими или одним выбором)

mSelectedItems = new ArrayList();  // Where we track the selected items
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Set the dialog title
builder.setTitle(R.string.pick_toppings)
// Specify the list array, the items to be selected by default (null for none),
// and the listener through which to receive callbacks when items are selected
       .setMultiChoiceItems(R.array.toppings, null,
                  new DialogInterface.OnMultiChoiceClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which,
                   boolean isChecked) {
               if (isChecked) {
                   // If the user checked the item, add it to the selected items
                   mSelectedItems.add(which);
               } else if (mSelectedItems.contains(which)) {
                   // Else, if the item is already in the array, remove it 
                   mSelectedItems.remove(Integer.valueOf(which));
               }
           }
       })
// Set the action buttons
       .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int id) {
               // User clicked OK, so save the mSelectedItems results somewhere
               // or return them to the component that opened the dialog
               ...
           }
       })
       .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int id) {
               ...
           }
       });

return builder.create();

Читать о http://developer.android.com/reference/android/app/AlertDialog.Builder.html#setSingleChoiceItems ( int, int, android.content.DialogInterface.OnClickListener)

Настраиваемое представление не требуется.

37
задан Varuna 30 May 2009 в 11:07
поделиться

8 ответов

Это работает:

Random generator = new Random();
Object[] values = myHashMap.values().toArray();
Object randomValue = values[generator.nextInt(values.length)];

Если вы хотите, чтобы случайное значение имело тип, отличный от объекта , просто добавьте приведение к последней строке. Итак, если myHashMap был объявлен как:

Map<Integer,String> myHashMap = new HashMap<Integer,String>();

Последняя строка может быть:

String randomValue = (String) values[generator.nextInt(value.length)];

Приведенная ниже не работает , Set.toArray () всегда возвращает массив Object s, который не может быть преобразован в массив Map.Entry .

Random generator = new Random();
Map.Entry[] entries = myHashMap.entrySet().toArray();
randomValue = entries[generator.nextInt(entries.length)].getValue();
52
ответ дан 27 November 2019 в 04:16
поделиться

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

  1. HashMap имеет метод значений , который возвращает Коллекцию значений на карте.
  2. Коллекция используется для создания Списка .
  3. Метод size используется для определения размера списка ,
31
ответ дан 27 November 2019 в 04:16
поделиться

Если вам нужно нарисовать другие значения с карты без повторения каких-либо элементов, вы можете поместить карту в список, а затем перемешать его.

List<Object> valuesList = new ArrayList<Object>(map.values());
Collections.shuffle( valuesList );

for ( Object obj : valuesList ) {
    System.out.println( obj );
}
10
ответ дан 27 November 2019 в 04:16
поделиться

Создайте случайное число от 0 до количества ключей в вашем HashMap . Получите ключ по случайному номеру. Получите значение из этого ключа.

Псевдокод :

 int n =  random(map.keys().length());
 String key = map.keys().at(n);
 Object value = map.at(key);

Если это сложно реализовать на Java, вы можете создать массив из этого кода, используя функцию toArray () в Установить .

 Object[] values = map.values().toArray(new Object[map.size()]);
 Object random_value = values[random(values.length)];

Я не совсем уверен, как делать случайное число.

3
ответ дан 27 November 2019 в 04:16
поделиться

Хороший ответ немного зависит от обстоятельств, в частности от того, как часто вам нужно получать случайный ключ для данной карты (NB, методика по существу одинакова, независимо от того, берете ли вы ключ или значение).

  • Если вам нужны разные случайные ключи из заданной карты, без карты изменение между получением случайные ключи, затем используйте случайный метод выборки при повторении через набор ключей. Фактически, что вы делаете это итерация по набору возвращается keySet (), и на каждом пункт рассчитать вероятность желая взять этот ключ, учитывая, как много вам понадобится в целом и номер, который вы уже набрали. затем сгенерировать случайное число и посмотреть, это число ниже, чем вероятность. (NB Этот метод всегда будет работать , даже если вам нужен только 1 ключ; в этом случае это не обязательно самый эффективный способ.)
  • Ключи в HashMap эффективны уже в псевдослучайном порядке. В крайний случай, когда вы будете только когда-либо понадобится один случайный ключ для учитывая возможную карту, вы могли бы даже просто вытащите первый элемент keySet () .
  • В других случаях (где вы либо нужно несколько возможных случайных ключей для данной возможной карты или карты будет меняться, если вы выбираете случайный ключи), вам необходимо создать или поддерживать массив / список ключей, из которых вы выбираете случайный ключ.
1
ответ дан 27 November 2019 в 04:16
поделиться

Вот пример того, как использовать метод массивов, описанный Питером Стюифзандом, также с помощью метода values ​​() -метод:

// Populate the map
// ...

Object[] keys = map.keySet().toArray();
Object[] values = map.values().toArray();

Random rand = new Random();

// Get random key (and value, as an example)
String randKey = keys[ rand.nextInt(keys.length) ];
String randValue = values[ rand.nextInt(values.length) ];

// Use the random key
System.out.println( map.get(randKey) );
0
ответ дан 27 November 2019 в 04:16
поделиться

Я действительно не знаю, почему вы хотите это сделать ... но если это помогает, я создал RandomMap, который автоматически рандомизирует значения, когда вы вызываете values ​​(), затем следующее работающее демонстрационное приложение может выполнить эту работу ...

  package random;

  import java.util.ArrayList;
  import java.util.Collection;
  import java.util.Collections;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Map;
  import java.util.TreeMap;

  public class Main {
      public static void main(String[] args) {
          Map hashMap = makeHashMap();
          // you can make any Map random by making them a RandomMap
          // better if you can just create the Map as a RandomMap instead of HashMap
          Map randomMap = new RandomMap(hashMap);

          // just call values() and iterate through them, they will be random
          Iterator iter = randomMap.values().iterator();

          while (iter.hasNext()) {
              String value = (String) iter.next();
              System.out.println(value);
          }
      }

      private static Map makeHashMap() {
          Map retVal;

          // HashMap is not ordered, and not exactly random (read the javadocs)
          retVal = new HashMap();

          // TreeMap sorts your map based on Comparable of keys
          retVal = new TreeMap();

          // RandomMap - a map that returns stuff randomly
          // use this, don't have to create RandomMap after function returns
          // retVal = new HashMap();

          for (int i = 0; i < 20; i++) {
              retVal.put("key" + i, "value" + i);
          }

          return retVal;
      }
  }

  /**
   * An implementation of Map that shuffles the Collection returned by values().
   * Similar approach can be applied to its entrySet() and keySet() methods.
   */
  class RandomMap extends HashMap {
      public RandomMap() {
          super();
      }

      public RandomMap(Map map) {
          super(map);
      }

      /**
       * Randomize the values on every call to values()
       *
       * @return randomized Collection
       */
      @Override
      public Collection values() {
          List randomList = new ArrayList(super.values());
          Collections.shuffle(randomList);

          return randomList;
      }

  }
0
ответ дан 27 November 2019 в 04:16
поделиться

Это зависит от вашего ключа - природа хеш-карты не позволяет этому случиться легко.

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

-1
ответ дан 27 November 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: