java - 仅迭代 Map 的一部分

标签 java data-structures indexing hashmap iteration

我将数据存储在 HashMap 中,我想通过多个线程同时访问该数据,以拆分对项目完成的工作。

通常(例如使用列表)我只会给每个线程一个索引来开始,并且可以轻松地分割工作,如下所示:

for(int i = startIndex; i < startIndex+batchSize && i < list.size(); i++)
{
    Item a = list.get(i);
    // do stuff with the Item
}

当然,这不适用于 HashMap,因为我无法通过索引访问它。

是否有一种简单的方法可以仅迭代 map 的一部分?在这种情况下我应该使用另一种数据结构吗?

我读到了关于 SortedMap 的内容,但它有太多我不需要的开销(对项目进行排序)。我有大量数据,性能至关重要。

任何提示将不胜感激。

最佳答案

首先,您不应该使用 HashMap,因为迭代顺序未定义。要么使用 LinkedHashMap,其迭代顺序与插入顺序相同(至少是定义的),要么使用 TreeMap,其迭代顺序是自然排序顺序。我会推荐 LinkedHashMap,因为插入一个条目会使映射的切片变得不可预测。

要划分 map ,请使用以下代码:

    LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();

    for (Map.Entry<Integer, String> entry : new ArrayList<Map.Entry<Integer,String>>(map.entrySet()).subList(start, end)) {
        Integer key = entry.getKey();
        String value = entry.getValue();
        // Do something with the entry
    }

我已经内嵌了代码,但展开它相当于:

List<Map.Entry<Integer, String>> entryList = new ArrayList<Map.Entry<Integer,String>>();
entryList.addAll(map.entrySet());
entryList = entryList.subList(start, end); // You provide the start and end index
for (Map.Entry<Integer, String> entry : entryList) ...

关于java - 仅迭代 Map 的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6644090/

相关文章:

java - 即使应用在线,也先查询 Firestore 离线数据

java - Elasticsearch 找不到 JAVA_HOME 或 Java,即使这两者都存在

java - 用于比较具有最常见属性的项目的高效数据结构

java - 如何在列表数据结构中编写 clear() 方法?

java - 打印出过滤流对象的一些字段

Java new Date() 当前时间错误

algorithm - 为什么通过插入元素构建堆的运行时间比使用 heapify 差?

java - 两个字段索引

python - 如何在 python 中选择二维数组的索引?

mysql:查找 mysql 列中的最短和最长值