Как я могу отсортировать treemap, используя его значения, а не ключ?Как отсортировать treemap на основе его значений?
ответ
Вы не можете, так как компаратор TreeMap запускается только против клавиш, например. см. это constructor.
В любом случае, вы можете использовать несколько коллекций, используя TreeMap (или, скорее, HashMap) для поиска элементов по клавишам и иметь SortedSet для итерации по значениям.
Обмен значениями и ключами.
Более серьезно, пожалуйста, предоставьте какой-то контекст, чего вы хотите достичь. Возможно, этого достаточно, чтобы сортировать после завершения другой обработки.
Как я могу их поменять? –
Он означает, что теперь вы должны использовать все, что используете сейчас, как значение, и наоборот. Таким образом, вы можете сортировать свою ценность, которая теперь является ключом. – Jorn
Это, как правило, плохой подход, поскольку карта имеет уникальные ключи (относительно compareTo), но не обязательно уникальные значения. Создать новую карту с ключами, замененными значениями, может дать вам другой набор данных. – Buhb
Вы можете попробовать дать компаратор, который сравнивает значения вместо ключей при создании TreeMap.
final TreeMap<Integer,String> tree = new TreeMap<Integer,String>();
tree.put(1, "1");
tree.put(2, "2");
tree.put(3, "3");
tree.put(4, "4");
final TreeMap<Integer,String> treeSortedByValues = new TreeMap<Integer,String>(new Comparator<Integer>()
{
public int compare(Integer o1, Integer o2)
{
return tree.get(o1).compareTo(tree.get(o2));
}
});
treeSortedByValues.putAll(tree);
for (Entry<Integer, String> e : treeSortedByValues.entrySet())
{
System.out.println(e.getKey() + ": " + e.getValue());
}
Apache Commons Collections имеет TreeBidiMap:
Этот класс гарантирует, что карта будет как в порядке возрастания ключа и значения порядке возрастания, отсортированные по естественному порядку для ключа и класса.
У этого порта Java5-generics here.
Ссылка была разбита –
Google Collections предоставляет TreeMultiMap.
Вы также можете использовать две коллекции. Что вы пытаетесь достичь? Можете ли вы объяснить свои варианты использования?
Вот решение:
public static <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {
Comparator<K> valueComparator = new Comparator<K>() {
public int compare(K k1, K k2) {
int compare = map.get(k2).compareTo(map.get(k1));
if (compare == 0) return 1;
else return compare;
}
};
Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
}
Обратите внимание, что карта сортируется от наибольшего значения до самого низкого.
Я получаю исключение stackoverflow с этим методом – superrache
Это на самом деле не работает!если все данные не находятся в исходной карте «Карта
Попробуйте под кодом, это отлично работает для меня. Вы можете выбирать как по возрастанию, так и по убыванию для сортировки.
package com.rais;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class SortMapByValue
{
public static boolean ASC = true;
public static boolean DESC = false;
public static void main(String[] args)
{
// Creating dummy unsorted map
Map<String, Integer> unsortMap = new HashMap<String, Integer>();
unsortMap.put("B", 55);
unsortMap.put("A", 80);
unsortMap.put("D", 20);
unsortMap.put("C", 70);
System.out.println("Before sorting......");
printMap(unsortMap);
System.out.println("After sorting ascending order......");
Map<String, Integer> sortedMapAsc = sortByComparator(unsortMap, ASC);
printMap(sortedMapAsc);
System.out.println("After sorting descindeng order......");
Map<String, Integer> sortedMapDesc = sortByComparator(unsortMap, DESC);
printMap(sortedMapDesc);
}
private static Map<String, Integer> sortByComparator(Map<String, Integer> unsortMap, final boolean order)
{
List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(unsortMap.entrySet());
// Sorting the list based on values
Collections.sort(list, new Comparator<Entry<String, Integer>>()
{
public int compare(Entry<String, Integer> o1,
Entry<String, Integer> o2)
{
if (order)
{
return o1.getValue().compareTo(o2.getValue());
}
else
{
return o2.getValue().compareTo(o1.getValue());
}
}
});
// Maintaining insertion order with the help of LinkedList
Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
for (Entry<String, Integer> entry : list)
{
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
public static void printMap(Map<String, Integer> map)
{
for (Entry<String, Integer> entry : map.entrySet())
{
System.out.println("Key : " + entry.getKey() + " Value : "+ entry.getValue());
}
}
}
Вот я сделал это ..
package Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
class MyComparator implements Comparator<Object> {
public int compare(Object o1, Object o2) {
return (((Integer) o2).compareTo((Integer) o1));
}
}
class MyComparator1 implements Comparator<Object> {
Map<Integer, String> map;
public MyComparator1(Map<Integer, String> m) {
this.map = m;
}
public int compare(Object o1, Object o2) {
return (((String) map.get(o1)).compareTo((String) map.get(o2)));
}
}
public class Map1 {
public static void main(String[] args) {
Map<Integer, String> hmap = new HashMap<Integer, String>();
hmap.put(5, "Ashok");
hmap.put(21, "Bhanu");
hmap.put(7, "chaman");
hmap.put(28, "dheeraj");
hmap.put(761, "edison");
hmap.put(1, "frank");
hmap.put(-6, "gopal");
hmap.put(78, "hari");
System.out.println("Hash Map:" + hmap);
Map<Integer, String> tmap = new TreeMap<>(hmap);
System.out.println("Tree Map:" + tmap);
MyComparator comp = new MyComparator();
Map<Integer, String> itmap = new TreeMap<>(comp);
itmap.putAll(hmap);
System.out.println("Tree Map Inreverse order:" + itmap);
Map<Integer, String> orderValuemap = new TreeMap<Integer, String>(new
MyComparator1(hmap));
orderValuemap.putAll(hmap);
orderValuemap.put(22,"hello");
for(Entry<Integer, String> mp:orderValuemap.entrySet())
System.out.println("Value : "+mp.getValue());
}
}
- 1. Как получить набор значений TreeMap и отсортировать его
- 2. Как отсортировать массив на основе значений элементов?
- 3. Отсортировать массив JSON на основе массива значений
- 4. Как создать TreeMap с компаратором на основе «внешних» значений
- 5. Сортировка значений в TreeMap
- 6. Как отсортировать словарь python на основе аналогичных значений и ключей?
- 7. Как отсортировать следующие буквенно-цифровые клавиши TreeMap?
- 8. Сортировка дерева TreeMap на основе значений, удаляющих повторяющиеся значения
- 9. ReactJS: Как отсортировать массив объектов на основе значений реквизитов?
- 10. Как отсортировать XML на основе значений даты с помощью jQuery
- 11. Как отсортировать столбцы dataframe на основе значений в нескольких строках?
- 12. Как отсортировать массив, заполненный объектами, на основе двух значений объекта?
- 13. Как отсортировать ячейки TableViewController на основе detailTextLabel.text значений?
- 14. Как отсортировать массив 2d на основе значений другого массива?
- 15. Как отсортировать один вектор на основе значений другого (с data.frame)
- 16. Как отсортировать JsonArray на основе нескольких значений в java?
- 17. Как отсортировать словарь на основе значений в d3.js?
- 18. Как отсортировать результат sql на основе значений в предыдущей строке?
- 19. Как отсортировать массив на основе значений другого массива?
- 20. Как отсортировать на основе заказа
- 21. Как отсортировать массив на основе его свойства объекта?
- 22. как отсортировать массив в php на основе его имени?
- 23. IOS необходимо отсортировать массив значений словарей на основе цены ключа
- 24. Как отсортировать dict по одному из его значений в Python?
- 25. Конструктор TreeMap значений List
- 26. Отсортировать массив на основе значений другого массива в PHP
- 27. Сортировка TreeMap на основе собственного правила
- 28. Как отсортировать его лучше?
- 29. Сортируйте treemap по значению и верните его как treemap agin.
- 30. Как отсортировать данные на основе idxmax?
Первым решением в этой связи является лучшим, что вы можете иметь. http://stackoverflow.com/questions/2864840/treemap-sort-by-value –