Чистый способ выглядит следующим образом:
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();
Настраиваемое представление не требуется.
Это работает:
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();
Поскольку требования запрашивают только случайное значение из HashMap
, вот подход:
Если вам нужно нарисовать другие значения с карты без повторения каких-либо элементов, вы можете поместить карту в список, а затем перемешать его.
List<Object> valuesList = new ArrayList<Object>(map.values());
Collections.shuffle( valuesList );
for ( Object obj : valuesList ) {
System.out.println( obj );
}
Создайте случайное число от 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)];
Я не совсем уверен, как делать случайное число.
Хороший ответ немного зависит от обстоятельств, в частности от того, как часто вам нужно получать случайный ключ для данной карты (NB, методика по существу одинакова, независимо от того, берете ли вы ключ или значение).
Вот пример того, как использовать метод массивов, описанный Питером Стюифзандом, также с помощью метода 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) );
Я действительно не знаю, почему вы хотите это сделать ... но если это помогает, я создал 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;
}
}
Это зависит от вашего ключа - природа хеш-карты не позволяет этому случиться легко.
Я могу придумать, как выбрать случайное число от 1 до размера хэш-карты, а затем начать итерацию по нему, поддерживая счетчик по ходу - когда счетчик равен на это случайное число, которое вы выбрали, это ваш случайный элемент.