我将数据存储在 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/