2014-11-25 3 views
0

Создал карту, а затем сортировал значения и помещал их в TreeMap. Но проблема в том, что когда я вызываю метод remove() в Treemap, элемент не удаляется. Кто-нибудь знает, в чем проблема?Элемент TreeMap не удален

Вот мой код:

Map<String , Double> map=new HashMap<String, Double>(); 
TreeMap<String, Double> sortedItems = sortMap(map); 
sortedItems.remove("I put the key here as a string"); 


    public TreeMap<String, Double> sortMap(Map<String, Double> map) { 
     HashMap<String, Double> map2 = new HashMap<String, Double>(map); 
     TreeMap<String, Double> sortedMap = SortByValue(map2); 
     return sortedMap; 
    } 

public TreeMap<String, Double> SortByValue 
     (HashMap<String, Double> map) { 
    ValueComparator vc = new ValueComparator(map); 
    TreeMap<String, Double> sortedMap = new TreeMap<String, Double>(vc); 
    sortedMap.putAll(map); 
    return sortedMap; 
} 
class ValueComparator implements Comparator<String> { 

    Map<String, Double> map; 

    public ValueComparator(Map<String, Double> base) { 
     this.map = base; 
    } 

    public int compare(String a, String b) { 
     if (map.get(a) >= map.get(b)) { 
      return -1; 
     } else { 
      return 1; 
     } // returning 0 would merge keys 
    } 
+0

Ключ «найден», когда compare() возвращает 0. Ваше сравнение никогда не возвращает 0, поэтому ни один ключ не может быть удален. – Arkadiy

ответ

1

Необходимо вернуть 0; когда вы ожидаете матча. Способ решить это - сравнить ключ, который в противном случае является совпадением. Таким образом, тот же ключ будет соответствовать, но только тот же ключ.

public int compare(String a, String b) { 
    int cmp = -map.get(a).compareTo(map.get(b)); 
    if (cmp == 0) 
     cmp = a.compareTo(b); 
    return cmp; 
} 

Этот способ Строковые ключи, которые сопоставляются с одним и тем же Двойным, рассматриваются как разные, если они являются разными Строками.

+0

Теперь с помощью этого метода сравнения вы написали, treemap не отсортирован должным образом – HimanAB

+0

@HimanUCC Что вы подразумеваете под «не отсортировано правильно»? если он должен быть отсортирован в обратном порядке, я изменил код. –

+0

О, извините. Я не проверял метод. Ты прав – HimanAB

1

возвращения 0 сольются ключи

Возвращение 0 означает, что они равны. Если вы не вернете 0, элементы никогда не будут равны. Ваш TreeMap использует данные Comparator для put и remove. Ваш Comparator никогда не идентифицирует два ключа как равные и, следовательно, ничего не может удалить.

+0

На самом деле карта отсортирована правильно, и я вижу элементы внутри сортируемого файла treemap. проблема заключается в методе remove(), о котором я упоминал. – HimanAB

+0

@HimanUCC Да, как 'remove', так и' put' используют ваш 'Comparator'. Попробуйте добавить запись с тем же ключом в свой 'TreeMap'. Вместо того, чтобы перезаписать предыдущую запись, вы получите новую запись. Ваш «Компаратор» ошибается. –

Смежные вопросы