2011-04-13 73 views
10

鉴于这种地图如何在Java TreeMap中选择前N个项目?

SortedMap<Integer, String> myMap = new TreeMap<Integer, String>(); 

而不是一个for循环是有一个实用功能,前n项复制到目的地地图?

+0

我还没有检查,但我不会感到惊讶,如果一些谷歌的Java API有一个班轮只是为了:) – SyntaxT3rr0r 2011-04-13 11:59:06

回答

5

也许,但不是作为标准Java API的一部分。并且:该实用程序将在内部使用循环。

所以你需要一个循环,但是你可以通过在一个工具类做的一切都是在一个静态方法创建自己的“工具”:

public static SortedMap<K,V> putFirstEntries(int max, SortedMap<K,V> source) { 
    int count = 0; 
    TreeMap<K,V> target = new TreeMap<K,V>(); 
    for (Map.Entry<K,V> entry:source.entrySet()) { 
    if (count >= max) break; 

    target.put(entry.getKey(), entry.getValue()); 
    count++; 
    } 
    return target; 
} 

的复杂性仍然是O(n)(我怀疑,人们可以(1)),但你使用它像一个工具实现Ø没有“看”的循环:

SortedMap<Integer, String> firstFive = Util.putFirstEntries(5, sourceMap); 
6

还有SortedMap.headMap()但是,您必须传递元素的密钥才能继续。你可以遍历N个元素在Map.keySet()找到它,例如:

Integer toKey = null; 
int i = 0; 
for (Integer key : myMap.keySet()) { 
    if (i++ == N) { 
     toKey = key; 
     break; 
    } 
} 

// be careful that toKey isn't null because N is < 0 or >= myMap.size() 
SortedMap<Integer, String> copyMap = myMap.headMap(toKey); 
0

你也可以使用一个ordored迭代器递减ID为实例,以获得第X个记录,订货:

Iterator<Integer> iterator = myMap.descendingKeySet().iterator(); 
6

使用Java的8+功率:

TreeMap<Integer, String> myNewMap = myMap.entrySet().stream() 
    .limit(3) 
    .collect(TreeMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), Map::putAll);