2016-06-21 14 views
3

私は与えられたIDを持つサンプルに行わリビジョンのマップを保持し、コードの一部を持っている:TreeMapを使用して、指定されたキー値より上のすべてのキー/値ペアを取得できますか?

private Map<Long, SampleId> sampleRevisionMap = new HashMap<>(); 

これを維持しながら、他のスレッドが与えられたリビジョン番号以降に行われたすべての変更を取得するためで呼び出すことができます。

public Set<SampleId> getRevisionIDs(long clientRevision) { 
    return sampleRevisionMap.entrySet().stream() 
       .filter(k -> k.getKey() > clientRevision) 
       .map(entry -> entry.getValue()) 
       .collect(Collectors.toSet()); 
}    

つまり、すべての値にしきい値を超えるキーを付けてください。

これを行うには、順序付けされたマップ、つまりjava.utils.TreeMapを使用するより良い方法があります。

+1

TreeMapが同期されていないことに注意してください。すべてのスレッドがキーと値のペアを読み込むことができます。 'syncMap = Collections.synchronizedSortedMap(treeMap)'を使用する必要があります – SomeDude

+0

'synchronizedSortedMap'からの返り値マップは変更可能であり、あるスレッドがそれを反復している間に他のスレッドが変更できます)。反復スレッドは、それを反復処理するスレッドで同期する必要があります。 ['synchronizedSortedMap'のドキュメント(https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedSortedMap-java.util.SortedMap-)を参照してください。 – Lii

答えて

4

はい、あなたはtailMapを呼び出すことによってそれを行うことができます。

public Collection<SampleId> getRevisionIDs(long clientRevision) { 
    return sampleRevisionMap.tailMap(clientRevision).values(); 
}  

は、上記と同様clientRevisionにマッピングされた値を含んでいます。それ以上のものが必要な場合は、代わりにclientRevision+1を使用してください。

+2

@BjarkeMoholt実際には、型TreeMapとして宣言するべきではありません。これは、型SortedMapまたはNavigableMapとして宣言する必要があります。実装ではなく契約を表す型を常に参照してください。 – VGR

関連する問題