如何在Java TreeMap中选择前N项?

时间:2011-04-13 11:21:03

标签: java map

鉴于此地图

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

是否有一个实用功能可以将前N个项目复制到目标地图而不是for循环?

5 个答案:

答案 0 :(得分:14)

使用Java 8 +的强大功能:

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

答案 1 :(得分:8)

可能,但不是标准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)(我怀疑,一个人可以实现O(1)),但你使用它就像一个没有“看到”循环的工具:

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

答案 2 :(得分:7)

SortedMap.headMap()但是你必须传递元素的密钥才能进行。你可以在Map.keySet()上迭代N个元素来找到它,例如:

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);

答案 3 :(得分:1)

您还可以使用ordored迭代器来获取前x个记录,或者通过降序id获取orderer,例如:

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

答案 4 :(得分:-1)

您可以使用putAll(Map t)函数将项目从地图复制到指定的地图。但它会复制所有项目。您无法复制固定数量的项目。

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Map.html#putAll%28java.util.Map%29