2013-09-11 3 views
0

У меня есть TreeMap с количеством записей.TreeMap удалить не работает

TreeMap<Long, List<Payment>> myPaymentsForYear; 

Чтобы удалить первую неделю с карты, я

private void removeDaysFromPast() { 
    for (int i = 0; i < WEEK; i++) { 
     long key = myPaymentsForYear().firstKey(); 
     myPaymentsForYear.remove(key); 
    } 
    System.out.println("date: " + new Date(myPaymentsForYear.firstKey()).toString()); 
} 

Однако печатное заявление всегда показывает, что firstKey не был удален. Фактически, не из семи элементов удаляется. Кто-нибудь знает, почему?

+1

Это выглядит супер запутанным: 'long key = myPaymentsForYear();' Предполагается, что это 'myPaymentsForYear.firstKey()'? – kiheru

+0

Да. Я редактировал. –

ответ

1

Оператор удаления TreeMap всегда будет возвращать объект, если он успешный, или значение null, если ключ не существует (при условии, что null является недопустимым ключом) или генерирует исключение. see reference. Вы проверили с помощью отладки, что на самом деле вы пытаетесь удалить существующий ключ и что ваш оператор удаления выполняется?

0

Код, который у меня выше, является полностью верным. Оказывается, ошибка была полностью где-то в другом месте.

0

было бы неплохо, если бы вы могли поделиться тем, где была ошибка?

В моем случае я хотел, чтобы TreeMap с длинным ключом сортировался в обратном порядке и реализовал соответствующий Comparator (который затем я передал TreeMap в конструкторе). Но как простого типа «длинный» не может быть использовано в компараторе, я должен был использовать тип объекта «Long» вместо:

public class LongComparatorInverted implements Comparator<Long> { 
@Override 
public int compare(Long lhs, Long rhs) { 
    return (lhs == rhs) ? 0 : (lhs < rhs) ? 1 : -1; 
} 

Sure, Android студия показывает предупреждение о «==», но больно я проигнорировал это ... С «длинным», являющимся типом объекта, наверняка не было никакой гарантии, что я сравниваю тот же объект при работе с TreeMap.

Так затруднительный для меня был - конечно - для использования вместо равен:

return (lhs.equals(rhs)) ? 0 : (lhs < rhs) ? 1 : -1; 

Не так легко найти, хотя ...

Так что, если вы столкнулись с такой ошибкой где «удалить «не работает, я попытаюсь сначала проверить, используете ли вы специальный компаратор и полностью проверяете компаратор перед его использованием.

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