2014-11-19 2 views
0

Интересно, почему нет способа произвольного доступа get(Object) как Map в Java Set. В текущей реализации повторение всей коллекции кажется ненужным накладными расходами.Нет метода произвольного доступа для Java Set

+0

Вот как работает набор/сумка по дизайну. – duffymo

+0

@duffymo, я так не думаю. Ничто не мешает прямому тестированию на членство в элементе в наборе. Ничто в дизайне не приводит к итерации –

+0

Какой ключ вы планируете использовать для доступа к элементу? Я думаю, что поведение больше похоже на сумку: доберитесь до и возьмите произвольную. Я бы назвал отсутствие в API доказательством моего заявления. – duffymo

ответ

4
> boolean contains(Object o) 
Returns true if this set contains the specified element. 

(от https://docs.oracle.com/javase/7/docs/api/java/util/Set.html)

+0

Но сложность времени - это O (n), что неэффективно по сравнению с методом get() 'random access. –

+0

Где говорится, что сложность O (n)? Это зависит от того, что на самом деле реализует интерфейс. HashSet будет O (1) –

+1

Источник Java (6) http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/java/util/HashSet.java показывает он просто вызывает 'containsKey' на HashMap. Никакая итерация по набору –

1

Set не о случайного поиска элемента — речь идет о тестировании на наличие в нем элементов. Если ваше приложение требует поиска, то то, что ему действительно нужно, - это сопоставление идентичности (карта, где вы находитесь put(key, key)). Тогда вы сможете get объект, как хотите. Также обратите внимание, что вы не будете нести накладные расходы, сделав это, потому что HashSet реализован в терминах HashMap почти точно таким же образом.

0

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

Set<Object> mySet = new HashSet<Object>(); 
mySet.add("one"); 
Object access = mySet.toArray()[0]; 
Смежные вопросы