2014-12-18 2 views
1

Я написал фрагмент логики, где моя цель - выбрать случайные ключи с карты. Карта была назначена как ConcurrentSkipListMap<Text,IntWritable> tuples. Кроме того, у меня нет опыта в области промышленного уровня с Java, поэтому я стараюсь преодолеть это.метод get (int) не определен для типа Set

Кусок кода

Set<Text> keys = tuples.keySet(); 
String randomKeys = keys.get(random.netInt(keys.size())) 

Я не может понять заявление об ошибке: method get(int) is undefined for the type Set<Text>

Кроме того, я искал подобную проблему, и решение действительно существует, используя List, но мои пары ключ/значение хранятся как ConcurrentSkipListMap, поэтому не могут это выяснить.

Спасибо.

+3

[Интерфейс Set] (http://docs.oracle.com/javase/7/docs/api/java/util/Set.html) не имеет метод get (int). Вот почему вы получаете 'undefined для типа Set ' – gtgaxiola

+0

Нет метода 'get (int)' для интерфейса 'Set'. Это существует только в интерфейсе ['List'] (http://docs.oracle.com/javase/7/docs/api/java/util/List.html#get (int)). –

+0

Нужно ли преобразовать этот набор в строку? – vamosrafa

ответ

4

Во-первых, Set не имеет метода get(). Вы можете использовать List. Кроме того, это Random.nextInt()

List<Text> keys = new ArrayList<>(tuples.keySet()); 
Text randomKeys = keys.get(random.nextInt(keys.size())); 

Кроме того, в зависимости от вашего потребительной случае я считаю, что это, вероятно, будет лучше Collections.shuffle(List)раз, а затем перебирать его (возможно, с for-each loop) как

List<Text> keys = new ArrayList<>(tuples.keySet()); 
Collections.shuffle(keys); 
for (String randomKey : keys) { 
    // ... 
} 
+0

Я сохранил свои кортежи как ConcurrentSkipMapList, хорошо ли объявлять его как List и ArrayList? – vamosrafa

+0

Мой ответ заключается только в копировании ключевых ссылок на временную структуру данных для перетасовки. Обратите внимание, что это вызывает 'tuples .keySet() ', когда он вызывает конструктор' ArrayList'. –

+0

Да, это работает.Я должен вернуть этот список как отсортированный, я думаю, что могу это понять. Спасибо. – vamosrafa

0

A У Set нет метода get(), потому что его не массив.

вы можете нормально итерацию через набор с его итератора:. Set.iteraor() следующая()

Интерфейс итератора реализует методы folowing:

public boolean hasNext() 
public E next() 
public void remove() 

вы можете использовать его как здесь (в этом случае является Set):

Iterator it = set.iterator(); 
while (it.hasNext()) 
{   
     String setText = (String) it.next(); 
     System.out.println(setText); 
} 
+3

У набора нет 'next()' метод. –

+0

Я только что видел это, спасибо – nidomiro

Смежные вопросы