#java
Есть map, как ее отсортировать по значению?
Ответы
Ответ 1
Mapmap = 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) { HashMapmap = 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, сразу сортируя по значению. ArrayListstrings = 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>(); SortedMapsortMapa = 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()); }
Комментариев нет:
Отправить комментарий