2016-06-21 4 views
3

나는 주어진 ID로 샘플을 수행 개정의지도를 유지 코드 조각이있다. 관련 ID를 찾으려면TreeMap을 사용하여 주어진 키 값을 초과하는 모든 키/값 쌍을 검색 할 수 있습니까?</p> <pre><code>private Map<Long, SampleId> sampleRevisionMap = new HashMap<>(); </code></pre> <p>이를 유지하면서, 다른 스레드가 주어진 개정 번호 이후의 모든 변경 사항을 얻을 수에서 호출 할 수

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이 동기화되지 않습니다. 모든 스레드가 키/값 쌍을 읽을 수 있다고 말하고 있습니다. 'synchronizedSortedMap = Collections.synchronizedSortedMap (treeMap)' – SomeDude

+0

'synchronizedSortedMap'의 리턴 맵은 변경 가능할 것이고 다른 스레드는 하나의 스레드가 그것을 반복하고있는 동안 그것을 수정할 수 있습니다 (또는 꼬리 맵의 값). iterating thread는 iterating하는 스레드와 동기화되어야한다. ['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