0

多数のエントリを持つ 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 が削除されていないことを示しています。実際、7つの要素のどれも削除されていません. 誰かが理由を知っていますか?

4

3 に答える 3

1

TreeMap remove ステートメントは、成功した場合は常にオブジェクトを返すか、キーが存在しない場合は null を返すか (null が無効なキーである場合)、例外をスローします。リファレンスを参照してください 。実際に存在するキーを削除しようとしていること、および remove ステートメントが実行されていることをデバッグによって確認しましたか?

于 2013-09-11T19:59:21.363 に答える
0

上記のコードは完全に正しいです。エラーは完全に別の場所にあることがわかりました。

于 2013-09-11T22:33:50.927 に答える
0

エラーがどこにあったかを共有していただければ幸いです。

私の場合、長い as キーを持つ TreeMap を逆の順序でソートし、それに応じた Comparator を実装したかった (コンストラクターで TreeMap に渡した)。ただし、単純な型「long」は Comparator では使用できないため、代わりにオブジェクト型「Long」を使用する必要がありました。

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

確かに、Android Studio は「==」に関する警告を表示しますが、私はそれを無視しました...「Long」はオブジェクト タイプであるため、TreeMap を操作するときに同じオブジェクトを比較するという保証はありませんでした。 .

したがって、私にとっての修正は、もちろん、代わりに equals を使用することでした。

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

そう簡単には見つからないけど…

したがって、「削除」が機能しないようなエラーが発生した場合は、最初に特別なコンパレータを使用しているかどうかを確認し、使用する前にコンパレータを完全にテストします。

于 2016-01-19T20:17:38.560 に答える