我对Java很陌生,很抱歉,如果这是超级基础的话。基本上我在数组列表中有一些数据并且它工作正常但在我的程序的后期部分我需要读取列表并且它需要很长时间,因为列表变得非常大。所以我想我可以将数组列表的某些部分(稍后需要)放入哈希映射中,以后可以从中提取数组列表的那一部分(希望这是有意义的)。
我首先使用我想要的所有数据创建数组列表(我有一个循环并调用在单个循环data_cache_local_loop中创建的每个数据):
HashMap hashmap_of_values = new HashMap(); //hashmap of arraylist
for (int i = 0; i<100; i++) {
....program logic and more loops
Set uniqie_T_cache = new HashSet(T_cache_local_loop); //make values unique
hashmap_of_values.put(i, new ArrayList(uniqie_T_cache));
}
然后,当我需要数据时,我会像这样提取它:
List t = new ArrayList();
t.add(hashmap_of_values.get(i));
但是我的程序失败了,我不确定为什么。当我打印出hashmap_of_values的大小时,我得到的是我期待的数量,但是当我打印出T的数量时,它只显示一个(当我运行程序时,它说T_cache_local_loop有数百项)。
有人能告诉我我做错了什么吗?我不是百分之百,但我想我可能会查看我添加为单个项目的数组列表,但我不确定我做错了什么。
答案 0 :(得分:4)
你应该真正使用泛型 - 它会帮助你很多,并使这些问题更加明显 - 但目前你的问题是那条线应该是
List t = (List) hashmap_of_values.get(i);
或
List t = new ArrayList((List) hashmap_of_values.get(i));
获取地图中列表的副本。 所做的是创建列表列表,因为hashmap_of_values.get(i)
已经是列表。
答案 1 :(得分:1)
尝试t.addAll(hashmap_of_values.get(i));
答案 2 :(得分:0)
当您将HashSet
添加到ArrayList
时,您将整个集合作为单个对象添加到ArrayList
的第一个索引中。您不将HashSet
的每个元素添加到ArrayList
。相反,你应该做类似的事情:
List newList= new ArrayList();
newList.addAll( unique_T_cache );
hashmap_of_values.put(i, unique_T_cache );