2013-10-09 5 views
0

Я создал TreeSet, и я пытаюсь добавить к нему Map.Entry. Но это не скомпилируется. Что я делаю не так?Java Map.Entry и TreeSet

TreeSet<Map.Entry<String, Integer>> treeSet = new TreeSet<Map.Entry<String, Integer>>(); 

treeSet.add(Map.Entry<String, Integer>("Text string...", 123)); 
+7

Почему вы не используете «TreeMap»? –

+0

Я думаю, что было бы лучше использовать свой собственный объект, реализуя собственные 'hashCode()' и 'equals()'. – Mauren

+0

Это школьное задание, просто следуйте инструкциям. Я еще не знаю, действительно знаю Java, и я застрял. – user1121487

ответ

3

Я не знаю, почему вы пытаетесь создать экземпляр Map.Entry. Думаю, вы можете просто использовать TreeMap.

Несмотря на то, если вы хотите, что вы можете создать экземпляр AbstractMap.SimpleEntry так:

Map.Entry<String,Integer> entry = 
    new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42); 

Обратите внимание, что Map.Entry является интерфейсом. Ой! И, конечно же, как справедливо указано в комментариях @Louis, Map.Entry не реализует Comparable, поэтому вы не сможете добавить его в TreeSet.

Однако вы можете создать свою собственную реализацию этого интерфейса, сделать этот инструмент Comparable<Map.Entry<K, V>> и использовать его вместо этого.


Но, как я уже говорил, вы можете использовать TreeMap и использовать его метод entrySet() который даст вам Set<Map.Entry<K, V>> в:

SortedMap<String, Integer> map = new TreeMap<>(); 
Set<Map.Entry<String, Integer>> set = map.entrySet(); 
+1

Единственным недостатком этого ответа является использование 'AbstractMap.SimpleEntry'. –

+0

'Карта.Entry' не реализует 'Comparable', поэтому вы не можете добавить' Map.Entry' в 'TreeSet', не указав' Comparator'. –

+0

@LouisWasserman Да пропустил это. Добавлено ваше мнение. :) –

1

От http://docs.oracle.com/javase/7/docs/api/java/util/Map.Entry.html:

запись на карту (пара ключ-значение). Метод Map.entrySet возвращает вид коллекции , элементы которого относятся к этому классу. Единственный способ получения ссылки на запись карты - это итератор этого вида . Эти объекты Map.Entry действительны только для продолжительности итерации ; более формально поведение записи карты не определено, если карта подложки была изменена после того, как запись была возвращена итератором , за исключением операции setValue в записи карты .

Другими словами - вы не можете делать то, что вы пытаетесь сделать. Хотя, как сказал Рохит Джейн, вы можете сделать что-то подобное с AstractMap.simpleEntry(..), мне кажется, что в этом мире очень мало случаев использования, где это было бы «хорошим» решением.

Вместо этого, если вы хотите хранить пары ключ/значение в TreeSet, вам необходимо создать свой собственный объект. Тем не менее - почему бы просто не использовать TreeMap или подобное?

+0

Мне предоставлен этот интерфейс: public TreeSet > test_1 (...); Так как это TreeSet, включая пары Map.Entry, это должно быть достижимо? – user1121487

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