Как отсортировать map по значению java

How to sort Map values by key in Java?

I have a Map that has strings for both keys and values.

Data is like following:

Eventually, I am trying to get two strings out of this Map.

Right now I have the following:

This gets me the questions in a string but they are not in order.

Как отсортировать map по значению java

17 Answers 17

Short answer

If this map is passed to you and you cannot determine the type, then you can do the following:

This will iterate across the map in natural order of the keys.

Longer answer

For cases where your keys are a complex type that doesn’t implement Comparable or you don’t want to use the natural order then TreeMap and TreeSet have additional constructors that let you pass in a Comparator :

Как отсортировать map по значению java

Assuming TreeMap is not good for you (and assuming you can’t use generics):

Using the TreeMap you can sort the map.

Be aware that the TreeMap is sorted according to the natural ordering of its ‘keys’

Как отсортировать map по значению java

Как отсортировать map по значению java

If you already have a map and would like to sort it on keys, simply use :

A complete working example :

Java 8 Example

We can modify the example to use custom comparator and to sort based on keys as:

Как отсортировать map по значению java

Using Java 8:

Как отсортировать map по значению java

In Java 8

To sort a Map by key, putting keys into a List :

To sort a Map by key, putting entries into a List > :

Как отсортировать map по значению java

This code can sort a key-value map in both orders i.e. ascending and descending.

Just in case you don’t wanna use a TreeMap

Also, in-case you wanted to sort your map on the basis of values just change Map.Entry::getKey to Map.Entry::getValue

Как отсортировать map по значению java

Как отсортировать map по значению java

We can also sort the key by using Arrays.sort method.

A good solution is provided here. We have a HashMap that stores values in unspecified order. We define an auxiliary TreeMap and we copy all data from HashMap into TreeMap using the putAll method. The resulting entries in the TreeMap are in the key-order.

How about below tree map:

What ever you put in this sortedMap it will be sorted automatically. First of all TreeMap is sorted implementation of Map Interface. There is a but as it sorts keys on [natural order fashion][https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html]. As Java doc says String type is a Lexicographic Natural order type. Imagine the below list of numbers with String type. means below list will be sorted not as expected.

List notSortedList = List.of(«78″,»0», «24», «39», «4»,»53″,»32″);

If you just you the default TreeMap constructor like below and push each element one-by-one like below:

As you see number 4 for example comes after ’39’. This is the nature of the Lexicographic data types like String. If that one was an Integer data type then that was okay though.

To fix this use argument to first check the length of the String and then compare them. In java 8 is done like this:

It first compare each element by length then apply check by compareTo as the input the same as the element to compare with.

If you prefer to use a more understandable method, the above code will be equivalent with below code:

Because the TreeMap constructor accepts the comparator Interface you can build up any even more complex implementation of Composite classes.

This is also another form more simplified version.

Источник

Java SortedMap

Интерфейс Java SortedMap, java.util.SortedMap, является подтипом интерфейса java.util.Map, за исключением того, что элементы, хранящиеся в карте, отсортированы внутри. Это означает, что вы можете перебирать элементы в порядке сортировки.

Реализация

Java поставляется со встроенной реализацией интерфейса SortedMap под названием TreeMap(java.util.TreeMap).

Как создать SortedMap?

Вы создаете экземпляр TreeMap через его конструктор:

Как создать с компаратором?

Можно передать реализацию Comparator конструктору TreeMap. Затем этот компаратор будет использоваться для сортировки ключей, пар значений, хранящихся в SortedMap. Вот пример:

Порядок сортировки

Порядок сортировки – это либо естественный порядок сортировки элементов (если они реализуют java.lang.Comparable), либо порядок, определенный компаратором, который вы можете задать.

По возрастанию или по убыванию

По умолчанию элементы идут в порядке возрастания, начиная с «наименьшего» и перемещаясь к «наибольшему». Но также возможно перебирать элементы в порядке убывания, используя метод TreeMap.descendingKeySet().

Итерация

Вы перебираете SortedMap точно так же, как вы перебираете обычную карту. Так как ключи отсортированы, вам, скорее всего, потребуется перебрать ключи в их отсортированном порядке. Вы перебираете их, вызывая его метод keySet(), например так:

Помните, что если вы хотите перебирать ключи в порядке убывания, а не в порядке возрастания, используйте метод sortedMap.descendingKeySet(). Iterator(), например:

Как получить компаратор?

Если ваша SortedMap была создана с использованием Comparator, вы можете получить его с помощью метода comptor():

Как получить первый ключ?

Интерфейс имеет метод ярлыков для получения первого (самого низкого) ключа в наборе ключей. Этот метод называется firstKey():

Как получить последний ключ?

Интерфейс имеет метод для получения последнего (самого высокого) ключа в наборе ключей – lastKey():

Получение первых элементов

Интерфейс имеет метод headMap(). Он возвращает новую карту, которая содержит первые элементы SortedMap в соответствии с используемым порядком сортировки. Метод принимает параметр, который действует как разделитель того, какие элементы включаются в возвращаемую карту заголовка. Все элементы с ключом, который меньше / ранее, чем параметр, переданный методу. Вот пример получения карты заголовка:

Возвращаемая карта головы будет содержать пары ключ-значение («a», «1») и («b», «2»), поскольку ключи «a» и «b» меньше / раньше, чем «c» в порядке сортировки (естественном порядке), используемом этим SortedMap.

Получение последних элементов

Интерфейс имеет метод с именем tailMap(), который возвращает новую карту Map. Она содержит последние элементы SortedMap в соответствии с используемым порядком сортировки. Метод принимает параметр, который действует как разделитель того, какие элементы включаются в возвращенную карту хвостов. Все элементы с ключом, равным или превышающим параметр, переданный методу. Вот пример:

Возвращенная карта хвоста будет содержать ключ, пары значений («c», «3»), («d», «4») и («e», «5»), поскольку «c», «d» и «e» больше или равно «c», переданному в качестве параметра tailMap().

Подкарта

Имеется метод subMap(), который может возвращать новую карту – подкарту SortedMap. Метод принимает два параметра, которые действуют как разделители для того, какие элементы включены в возвращаемую подкарту. Она будет включать все элементы, у которых ключ равен первому параметру или превышает его, а второй – меньше. Вот пример:

Возвращенная подкарта будет содержать ключ, пары значений (“b”, “2), (” c “,” 3 “) и (” d “,” 4 “), поскольку ключи” b “,” c “и” d “равны или больше, чем” b “, и меньше, чем” e “.

Источник

Русские Блоги

Java Map сортировка по ключу и сортировка по значению

HashMap: Наша наиболее часто используемая карта, она хранит данные в соответствии со значением HashCode ключа, и его значение может быть получено непосредственно в соответствии с ключом, и у него очень высокая скорость доступа. HashMap позволяет только одной записи иметь значение ключа Null (несколько записей будут перезаписаны); значение нескольких записей может быть Null. Асинхронный.

TreeMap: Реализация NavigableMap на основе красно-черного дерева, Сохраненные записи могут быть отсортированы по ключу, по умолчанию используется возрастающий порядок, вы также можете указать компаратор сортировки. TreeMap не допускает, чтобы значение ключа было нулевым. Асинхронный.

Hashtable: Подобно HashMap, разница заключается в следующем: значения ключа и значения не могут быть нулевыми; он поддерживает синхронизацию потоков, то есть только один поток может записывать Hashtable в любое время, что также приводит к медленной записи Hashtale.

LinkedHashMap: Порядок вставки записей сохраняется. Когда итератор используется для обхода LinkedHashMap, первая запись должна быть вставлена ​​первой. При обходе она будет медленнее, чем HashMap. И ключ, и значение могут быть пустыми и асинхронными.

По умолчанию TreeMap находится в порядке возрастания.Если нам нужно изменить метод сортировки, нам нужно использовать компаратор: Comparator.
Сортировать по ключу:

Сортировать по значению TreeMap Принцип: поместите все элементы на карте для сортировки в список, а затем используйте статический метод сортировки коллекций. Сортировать.

Значение HashMap не имеет порядка, оно реализуется в соответствии с HashCode ключа. Для этого неупорядоченного HashMap вы можете обратиться к сортировке значений TreeMap для достижения.

Источник

How to sort a Map in Java

By mkyong | Last updated: August 12, 2016

Viewed: 650,575 (+767 pv/w)

Few Java examples to sort a Map by its keys or values.

1. Sort by Key

1.2 Yet another java.util.TreeMap example, provide a custom Comparator to sort the key in descending order.

2. Sort by Value

2.2 Upgrade the above sortByValue() method to support generics.

References

mkyong

Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter. If you like my tutorials, consider make a donation to these charities.

Comments

How do you sort Stringed Keys that contain numbers e.g
“London 1”
“London 10”
“London 2”
“London 3”

master… how if I want sort Map by length value from bigger.

from bigger? Example?

thanks very good blog

How to sort in descending order?

make just a little change here:
return (o2.getValue()).compareTo(o1.getValue());

Awesome post. I love the detail you put into it. I was trying to sort a map by its values and your implementation worked perfectly. I put it into a MapUtils class and put the proper attribution into the Javadoc so you get credit in case anyone ever sees it. Thanks.

You can just make for() and counter. When counter is equal to 10 then just call “break”
int i=0;
for(Map.Entry entry: myMap.entrySet()) <
//do something
i++;
if(i==10) <
break;
>
>

Hi, you can also use generic version for sorting HashMap by values. I have discussed it here
http://goo.gl/WvOBfZ

how can i sort if Value is a String object

Thanks from Morocco.

// Program of Map Sort By VALUES

* @author PRAVIN RANE

public class ExtendedMap <

private Map map = new TreeMap();

private Map orignalHashMap= new LinkedHashMap();

throw new Exception(“Null value passed in map!”);

public Map backSortedMap()<

String key = (String) it.next();

String value = map.get(key)+””;

public void setMap(Map map)<

Set keys = map.keySet();

Iterator iterator = keys.iterator();

String key = (String) iterator.next();

put((K) key, map.get(key));

// TODO Auto-generated catch block

only problem is that the values are put in a TreeSet which removes duplicates, if any.

I have used below and I am getting key as sorted way.

Map objNormalTemplateHashMap=new TreeMap ();

Please let me know, is this correct way to do?

Sorting TreeMap with key will not work when the key is more than 10. The result will not be in a soreted manner.

Mind to give me an example, TreeMap works well at my end.

It is very useful information in my one of functional part in my Project

this is perfect.
Thanks
from colombia

Как отсортировать map по значению java

[…] How to sort a Map in Java Tags : java list map mkyong Founder of Mkyong.com, love Java and open source stuffs. Follow him on Twitter, or befriend him on Facebook or Google Plus. Btw, Mkyong.com is hosted on Liquid Web, a perfect hosting provider, 100% uptime and 24 hours support. […]

Very good example but it will fail if you try using null as value.

Why not to use SortedMap? It exists in the Java API since 1.2 version. There is no need to re-invent anything!

TreeMap is one of the SortedMap Implementation.

Because SortedMap orders by Keys, this implementation sorts by the values.

Thanks for the very nice piece of code рџ™‚

Very nice website thanks for ur work..

Как отсортировать map по значению java

Nice man,
Mine, very quick attempt without much thinking, after having a few beers:) :
sortedValues = new TreeSet(unsortMap.values()).asList();
HashMap sortedMap = new HashMap
for (Object value : sortedValues) < //sorted iteration
for ( Set entry : unsortMap.entrySet() <
if (entry.getValue().equals(value) <
sortedMap.put(entry.getKey(), entry.getValue());
>
>
>

Как отсортировать map по значению java

There’s no guarantee the posted implementation will work. Or work on every platform.

The contract for a Map does not guarantee the ordering of its Map.Entry members.

So, just because you sort the values and then put them back in the map in that order, there’s no contract guarantee that the collection returned from values() or an iteration of the entrySet() will be in that order.

The replies that use TreeMap with a special comparator might work, but they defy the contract of TreeMap, which says the entries are sorted by KEY; wrap that TreeMap in a new class that makes an explicit contract to order its entries by value and hide all the implementation details inside.

Isn’t that what the LinkedHashMap does? Provide a predictable iteration order based on input order?

Thanks for your sharing, So, do you have alternative way to sort a Map by ts value?

for sorting Map.Entry values, you can use Collections.sort(list,Map.Entry.comparingByValue());
This is easy than to write a custom comparator.

I think, it possible to Sort a Map by values using Set instead of List.

why does one need to do this, I wonder… then I may have a solution…

LinkedHashMap is a concrete class? I’ve never needed to do what is being described, so… ignorance is bliss… I stick to using Map as an interface and do not write code that requires a specific implementation.

A use case of a sorted map is that: 1. when u put pairs into a map, u want to remove or update on duplicated keys, i.e. keep keys uniq. 2. you need a sorted list, say then u can ask for the top 5 keys that have the bigger values. This is actually a very valuable and useful case.

Take it to the next level and make it like TreeMap but on the values so whenever you insert it goes into the sorted by value spot.

Here is a shorter version I’ve written that doesn’t use a list

Still more shorter рџ™‚ try this..

TreeMap sortedByValues = new TreeMap(unsortedMap);

sortedMap – map will be sorted by key.

Thanks for this non-list sorting example, but this put the map’s value sorted in descending order, can it be ascending as well?

Yes inverse k1 and k2 in the comparator

Few comments:
1) The example is probably better named ValueSortedMap, to not confusing with existing java.util.SortedMap, which is by keys.

2) Your example mixed with Java generics and then not using it all the way through. Very annoying. You should correctly typing the List and Map.Entry for example will save you from casting.

3) Probably good to mention a great use case for this is where you use a Map model to display a HTML form (spring form) option list, and want to sort the listing values.

4) If you are not going to have duplicated values in the map, consider using the commons-collections library, which provided TreeBidiMap just for this. You just call inverseBidiMap() to get a reversed map with values sorted as keys! But the library is not fitted with 1.5 generics though, minor thing consider you get all the implementation for free. рџ™‚

Источник

Сортировка HashMap по ключам в Java

// Java-код для сортировки карты по значению ключа

// Эта карта хранит несортированные значения

static Map map = new HashMap<>();

// Функция сортировки карты по ключу

public static void sortbykey()

// TreeMap для хранения значений HashMap

TreeMap sorted = new TreeMap<>();

// Копируем все данные из hashMap в TreeMap

// Отображаем TreeMap, который естественно отсортирован

for (Map.Entry entry : sorted.entrySet())

System.out.println( «Key = » + entry.getKey() +

public static void main(String args[])

// помещаем значения в карту

// Вызов функции sortbyKey

Использование TreeMap (конструктор)

// Java-код для сортировки карты по значению ключа

// Эта карта хранит несортированные значения

static Map map = new HashMap<>();

// Функция сортировки карты по ключу

public static void sortbykey()

// TreeMap для хранения значений HashMap

TreeMap sorted = new TreeMap<>(map);

// Отображаем TreeMap, который естественно отсортирован

for (Map.Entry entry : sorted.entrySet())

System.out.println( «Key = » + entry.getKey() +

public static void main(String args[])

// помещаем значения в карту

// Вызов функции sortbyKey

Использование ArrayList

// Java-код для сортировки карты по значению ключа

// Эта карта хранит несортированные значения

static Map map = new HashMap<>();

// Функция сортировки карты по ключу

public static void sortbykey()

new ArrayList (map.keySet());

// Отображаем TreeMap, который естественно отсортирован

for (String x : sortedKeys)

System.out.println( «Key = » + x +

public static void main(String args[])

// помещаем значения в карту

// Вызов функции sortbyKey

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *