Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Сортировка map по значению java

#java


Есть map, как ее отсортировать по значению?    


Ответы

Ответ 1



Map map = new HashMap<>(); List list = new ArrayList(map.entrySet()); Collections.sort(list, new Comparator>() { @Override public int compare(Map.Entry a, Map.Entry b) { return a.getValue() - b.getValue(); } }); Исправил

Ответ 2



java 8 import java.util.Map; import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap map = new HashMap(); map.put(1, 10); map.put(2, 30); map.put(3, 50); map.put(4, 40); map.put(5, 100); map.put(6, 60); map.put(7, 110); map.put(8, 50); map.put(9, 90); map.put(10, 70); map.put(11, 80); map.entrySet().stream() .sorted(Map.Entry.comparingByValue().reversed()) .forEach(System.out::println); // или любой другой конечный метод } } Вывод: 7=110 5=100 9=90 11=80 10=70 6=60 3=50 8=50 4=40 2=30 1=10

Ответ 3



Сходу написать такой сортировщик не так просто. По крайней мере, я для себя выбрал в этом случае такую стратегию: раз написал, много раз используй. Поэтому такой сортировщик я написал через Generics т.к. в map может иметь и другие типы в качестве ключа и значения. Ниже я поделюсь двумя версиями сортировочного метода. Для Java version = 7 и для Java version = 8. Итак, если у Вас 7-я версия Java: public static > Map sortByValue(Map map ) { List> list = new LinkedList<>(map.entrySet()); Collections.sort( list, new Comparator>() { @Override public int compare(Map.Entry o1, Map.Entry o2) { return (o1.getValue()).compareTo( o2.getValue() ); } } ); Map result = new LinkedHashMap<>(); for (Map.Entry entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; } Т.е., сначала, как писал @Nofate, вытаскиваем список entries (это у нас переменная list), затем сортируем эти entries по значениям и заливаем в новую мапу (это у нас result). Для результирующей мапы я использовал LinkedHashMap чтобы при добавлении элементы не пересортировывались. А вот версия с использованием Stream'ов из Java 8: public static > Map sortByValue( Map map ) { Map result = new LinkedHashMap<>(); Stream > st = map.entrySet().stream(); st.sorted(Comparator.comparing(e -> e.getValue())) .forEach(e ->result.put(e.getKey(),e.getValue())); return result; }

Ответ 4



Делаем два ArrayList-а с ключом и значением. Парсим HashMap, сразу сортируя по значению. ArrayList strings = new ArrayList<>(); ArrayList floats = new ArrayList<>(); for (HashMap.Entry e : map.entrySet()) { float value = e.getValue(); boolean isAdded = false; for (int i = 0; i < floats.size(); i++) { if (value > floats.get(i)) { floats.add(i, value); strings.add(i, e.getKey()); isAdded = true; break; } } if (!isAdded) { floats.add(value); strings.add(e.getKey()); } } for (int i = 0; i < strings.size(); i++) { Log.d(TAG, "sort: " + strings.get(i) + "=" + floats.get(i)); } На выходе отсортированные ArrayList-ы.

Ответ 5



TreeMap< String ,Integer> map= new TreeMap< String,Integer>(); SortedMap sortMapa = new TreeMap(new IntegerComparator()); Iterator it = map.entrySet().iterator(); while(it.hasNext()) { @SuppressWarnings("unchecked") Entry< String ,Integer> En = (Entry) it.next(); sortMapa.put( En.getValue(), En.getKey()); } Iterator sortit = sortMapa.entrySet().iterator(); while(sortit.hasNext()) { @SuppressWarnings("unchecked") Entry< Integer,String > sEn = (Entry) sortit.next(); System.out.println(sEn.getValue()+"-->"+sEn.getKey()); }

Комментариев нет:

Отправить комментарий