Guavaのコンピューティングマップの上にSortedMapを構築するにはどうすればよいですか(またはその逆)?ソートされたマップキーと、オンザフライで値を計算する必要があります。
3 に答える
2
最も簡単な方法は、MapMaker のビルド済みのソートされていない型に依存するのではなく、おそらく ConcurrentSkipListMap と memoizer のイディオム (JCiP を参照) を使用することです。基礎として使用できる例は、デコレータの実装です。
于 2010-12-30T19:27:35.500 に答える
0
スレッドセーフが必要な場合、これは注意が必要ですが、そうでない場合は、Emilの提案に近いものをお勧めしますが、直接ForwardingSortedMap
拡張するのではなく、使用しTreeMap
ます。
于 2010-12-28T18:49:28.300 に答える
0
このようなことができるかもしれません.これは完全な実装ではありません.アイデアを伝えるための単なるサンプルです.
public class SortedComputingMap<K, V> extends TreeMap<K, V> {
private Function<K, V> function;
private int maxSize;
public SortedComputingMap(int maxSize, Function<K, V> function) {
this.function = function;
this.maxSize = maxSize;
}
@Override
public V put(K key, V value) {
throw new UnsupportedOperationException();
}
@Override
public void putAll(Map<? extends K, ? extends V> map) {
throw new UnsupportedOperationException();
}
@Override
public V get(Object key) {
V tmp = null;
K Key = (K) key;
if ((tmp = super.get(key)) == null) {
super.put(Key, function.apply(Key));
}
if (size() > maxSize)
pollFirstEntry();
return tmp;
}
public static void main(String[] args) {
Map<Integer, Long> sortedMap = new SortedComputingMap<Integer, Long>(3,
new Function<Integer, Long>() {
@Override
public Long apply(Integer n) {
Long fact = 1l;
while (n != 0)
fact *= n--;
return fact;
}
});
sortedMap.get(12);
sortedMap.get(1);
sortedMap.get(2);
sortedMap.get(5);
System.out.println(sortedMap.entrySet());
}
}
于 2010-12-24T06:44:59.270 に答える