Элемент TreeMap не удаляется

Я создал карту, а затем отсортировал значения и поместил их в TreeMap. Но проблема в том, что когда я вызываю метод remove() для 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
    }

person HimanAB    schedule 25.11.2014    source источник
comment
Ключ найден, когда compare() возвращает 0. Ваше сравнение никогда не возвращает 0, поэтому ни один ключ не может быть удален.   -  person    schedule 25.11.2014


Ответы (2)


Вам нужно вернуть 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;
}

Таким образом, ключи String, которые сопоставляются с одним и тем же Double, рассматриваются как разные, если они являются разными строками.

person Peter Lawrey    schedule 25.11.2014
comment
Теперь с помощью этого метода сравнения, который вы написали, карта дерева не отсортирована должным образом. - person HimanAB; 25.11.2014
comment
@HimanUCC Что вы имеете в виду под неправильной сортировкой? если предполагается обратная сортировка, я изменил код. - person Peter Lawrey; 25.11.2014

возврат 0 приведет к объединению ключей

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

person Sotirios Delimanolis    schedule 25.11.2014
comment
На самом деле карта отсортирована правильно, и я вижу отсортированные элементы внутри карты дерева. проблема связана с методом remove(), о котором я упоминал. - person HimanAB; 25.11.2014
comment
@HimanUCC Да, и remove, и put используют ваш данный Comparator. Попробуйте добавить запись с таким же ключом в свой TreeMap. Вместо того, чтобы перезаписывать предыдущую запись, вы получите новую запись. Ваш Comparator неверен. - person Sotirios Delimanolis; 25.11.2014