Хорошо, эта версия работает с двумя новыми объектами Map и двумя итерациями и сортирует по значениям. Надеюсь, все работает хорошо, хотя записи на карте должны быть зациклены дважды:
public static void main(String[] args) {
Map<String, String> unsorted = new HashMap<String, String>();
unsorted.put("Cde", "Cde_Value");
unsorted.put("Abc", "Abc_Value");
unsorted.put("Bcd", "Bcd_Value");
Comparator<String> comparer = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}};
System.out.println(sortByValue(unsorted, comparer));
}
public static <K, V> Map<K,V> sortByValue(Map<K, V> in, Comparator<? super V> compare) {
Map<V, K> swapped = new TreeMap<V, K>(compare);
for(Entry<K,V> entry: in.entrySet()) {
if (entry.getValue() != null) {
swapped.put(entry.getValue(), entry.getKey());
}
}
LinkedHashMap<K, V> result = new LinkedHashMap<K, V>();
for(Entry<V,K> entry: swapped.entrySet()) {
if (entry.getValue() != null) {
result.put(entry.getValue(), entry.getKey());
}
}
return result;
}
Решение использует TreeMap с компаратором и сортирует все нулевые ключи и значения. Сначала для сортировки значений используется функция упорядочения из TreeMap, затем отсортированная карта используется для создания результата в виде LinkedHashMap, который сохраняет тот же порядок значений.
Greetz, GHad