2016-09-12 15 views
-2

が存在するとき、私はこのようなのTreeMapを作成したキーに対してnullを返します他の理由によりハッシュ):JavaのTreeMapの値は

public int compareDay(Date lhs, Date rhs) { 
    Calendar cal1 = Calendar.getInstance(); 
    Calendar cal2 = Calendar.getInstance(); 
    cal1.setTime(lhs); 
    cal2.setTime(rhs); 
    boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && 
      cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR); 
    if (sameDay) { 
     return 0; 
    } else { 
     return -1; 
    } 
} 

とにかく、問題は以下のスニペットです。最後の要素は、取得するとnullです。

public List<MyType> convert(Map<Date, List<MyInput>> inputByDate, Map<Date, Boolean> isDoneByDate) { 
     List<MyType> result = Lists.newArrayList(); 
     for (Date dateKey : inputByDate.keySet()) { 
      boolean isDone = false; 
      Boolean res = isDoneByDate.get(dateKey); 
      if (res != null) { 
       isDone = res; 
      } 
      List<MyInput> inputs = inputByDate.get(dateKey); 

      MyType retrieved=new MyType(dateKey, inputs, isDone); 
      result.add(retrieved); 
     } 
     return result; 
    } 

私ははっきりと(を例として)があることがわかりますデバッガnullでない値を持つ3つのキーと最後のスニペットを実行します。私はここで何かが欠けているはずです。なぜなら、各キーが以前に有効なペアと照合されていることを検証した場合、レポートがnullになることはありません。どんな助けでも大歓迎です。

+0

コンパレータは、==と!=だけでなく、<, ==, >を決定する必要があります。これは負の0または正の戻り値です。コンパイラのドキュメントをチェックしてください。 -1はlhs

+0

Btw、 'inputByDate()'ではなく 'inputByDate.keySet()'を意味しますか? 'reportsByDay'とは何ですか? – Thomas

+0

私の実際のコードに適用した私の "難読化"が間違っていました。今修正されました。 –

答えて

3

日付が異なる場合は、あなたのコンパレータは返す必要があります-1 または 1を、それは対称的である必要があるため、あなたが返すつまり場合は-1 date1date2を比較するとき、あなたはdate2date1を比較するときに1を返すことがあります。キーの順序を確実に判断できないため、コードはマップを破るようにバインドされています。

したがって、このような何かにあなたのcompare()をリファクタリング:

int result = Integer.compare(cal1.get(Calendar.YEAR), cal2.get(Calendar.YEAR)); 
if(result == 0) { //if the year is equal compare the days 
    result = Integer.compare(cal1.get(Calendar.DAY_OF_YEAR), cal2.get(Calendar.DAY_OF_YEAR)); 
} 
return result; 

編集:おそらくあなたのコンパレータで何が起こったかの小さな内訳を。

ソースを見ると、マップが新しいキーと既存のキーを比較することがわかります。つまり、常に等しくないキーが-1を返すので、マップは常に左の枝をたどるため、最後に追加された要素は「最小」になります。しかしそれはもう一つの問題です。

あなたが直面している問題は、get(key)によって間接的に呼び出されるgetEntryUsingComparator()メソッドにあります。あなたが原因常に-1を返すメソッドは何より左の要素が存在しないため、常にp = nullp = p.left結果までcmp < 0ブランチを実行します、その後、whileループが終了されるまで見ることができるように

Comparator<? super K> cpr = comparator; 
if (cpr != null) { 
    Entry<K,V> p = root; 
    while (p != null) { 
    int cmp = cpr.compare(k, p.key); 
    if (cmp < 0) 
     p = p.left; 
    else if (cmp > 0) 
     p = p.right; 
    else 
     return p; 
    } 
} 
return null; 

:メソッドは次のようになりますあなたはreturn null;になります。

+0

私はコンパレータが対称ではないことに気付いていましたが、私は "これで構いません、とにかくこのマップには10以上のキーがありません"と考えました。それは今働いているので、悪い動きだった。 –

+0

@why_vincentこれはうまくいきました。 – Thomas