2013-05-14 2 views
4

Как известно, SortedMap ведет записи, отсортированные по ключам. Я прочитал много потоков на этом форуме и увидел много примеров, которые сортируют SortedMap по значениям. Однако, как вы знаете, когда я поместил элемент по умолчанию SortedMap, он не сортирует карту снова, просто поместите эту новую запись там, где она должна быть.Ведение сортировки по значению

Например,

SortedMap<String,Person> sortedMap = new TreeMap(); 
Person p1 = new Person("John",38); 
sortedMap.put(p1.getName(), p1); 
Person p2 = new Person("Tom",34); 
sortedMap.put(p2.getName(), p2); // does not sort, maintains sorted set by comparing the other values 
Person p3 = new Person("Susan",21); 
sortedMap.put(p3.getName(), p3); // does not sort, maintains sorted set by comparing the other values 

Во многих нитей в этом форуме, я видел много много кода, который сортирует SortedMap по значениям путем вызова метода сортировки, как:

sortedMap.sort(sortedMap.entries()); 

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

Но мне нужна реализация карты, которая сохраняет значения как отсортированные без метода сортировки вызовов, как я объяснил выше. Например, в приведенном выше коде я могу просто вызвать метод firstKey(); но вместо этого мне нужно вызвать метод firstValue().

Person minimumAgePerson = sortedMap.firstValue(). 
System.out.println(minimumAgePerson.getName()); // it should print "Susan" 

SortedSet не подходит для моих requiremenets, потому что я могу поставить некоторые новые объекты (Person), ключ значение уже в карте, эти только добавленные записи должны переопределить существующие объекты (так что я нужна карта):

Person p4 = new Person("Susan",39); 
sortedMap.put(p4.getName(),p4); 
Person newMinimumAgePerson = sortedMap.firstValue(); 
System.out.println(newMinimumAgePerson.getName()); // it should print "Tom" 

Есть ли реализация для выполнения этих taks или мне нужно реализовать SortedSet самостоятельно?

+1

Зачем вам это нужно?Я полагаю, что вы выбрали неправильную структуру данных для своей задачи, так как я не представляю практически никакого приложения Карты, отсортированной по значениям, где может использоваться некоторая другая структура (например, отсортированный список или что-то еще). – bezmax

ответ

1

Существует не реализация, которая содержит сортировку как по ключу, так и по значению. Но на самом деле любая реализация, которая сделала это, в любом случае потребует отдельной структуры данных для сортировки по значению, поэтому вы можете также создать эту структуру данных.

Я бы предположил, что вы просто применяете отсортированную структуру, используя существующую структуру Like TreeMap или PriorityQueue в зависимости от ваших потребностей. Как только это было сделано, я, вероятно, расширил TreeMap с помощью настраиваемой структуры и переопределял методы put, remove, addAll и т. Д., Чтобы поместить его как в супер карту, так и в вашу сортировку по структуре ключей.

3

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

Это мне не ясно, если вы хотите иметь одинаковое значение для двух разных ключей. В этом случае вам нужно будет использовать какой-то SortedMultiSet.

+0

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

3

Часто самый простой и безопасный способ решения этой проблемы состоит в том, чтобы написать класс, который использует две различные стандартные коллекции. Класс может предложить именно те методы, которые вам нужны, не обязательно соответствующие любому интерфейсу java.util.

Учитывая указанные требования, я бы использовал SortedMap для хранения значений в сочетании с ключами сопоставления HashMap со значениями. Чтобы предотвратить дублирование ключей, поместите пару ключ-значение в HashMap, проверив результат put. Если ключ уже присутствовал, удалите старое значение из SortedMap перед добавлением нового значения.

Если у вас есть дополнительные требования, этот дизайн может не охватывать все, но концепция объединения структур java.util является в целом полезной.

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