从 ArrayList Java 中的 HashMap 键中检索所有值
Posted
技术标签:
【中文标题】从 ArrayList Java 中的 HashMap 键中检索所有值【英文标题】:Retrieve all values from HashMap keys in an ArrayList Java 【发布时间】:2012-10-09 05:49:19 【问题描述】:美好的一天,这让我有点困惑(大脑冻结!)并且似乎遗漏了一些东西。有一个我用 HashMap 填充的 ArrayList。现在我放入我的 HashMap 和 arraylist。
Map.put(DATE, value1);
Map.put(VALUE, value2);
arraylist.put(Map);
由于解析 JSON,arraylist 的大小显着增加。现在我的问题是如何从数组列表中的两个映射键中获取值?这个我试过了
if(!list.isEmpty()) // list is an ArrayList
for(int k = 0; k < list.size(); k++)
map = (HashMap)list.get(k);
Log.d(TAG, "map size is" + map.size());
String [] keys = new String[map.size()];
String [] date_value = new String[map.size()];
String [] value_values = new String[map.size()];
int i = 0;
Set entries = map.entrySet();
Iterator iterator = entries.iterator();
while(iterator.hasNext())
Map.Entry mapping = (Map.Entry)iterator.next();
keys[i] = mapping.getKey().toString();
date_value[i] = map.get(keys[i]);
if(keys[i].equals(DATE))
date_value[i] = map.get(keys[i]);
else if(keys[i].equals(VALUE))
value_values[i] = map.get(keys[i]);
i++;
但我似乎无法获得所有值。 Map 大小总是返回 2 的值,这只是元素。如何从 ArrayList 中的 Map 键中获取所有值?谢谢
【问题讨论】:
如果您想要两个地图中的密钥,您将需要实际从两个地图中获取密钥。您的代码只是从列表中的最后一个地图中获取键。 【参考方案1】:创建一个String
类型的ArrayList
来保存映射的值。在其构造函数中调用 Map 类的方法values()
。
Map <String, Object> map;
List<Object> list = new ArrayList<Object>(map.values());
【讨论】:
【参考方案2】:它具有从地图中查找所有值的方法:
Map<K, V> map=getMapObjectFromXyz();
Collection<V> vs= map.values();
遍历vs
做一些操作
【讨论】:
【参考方案3】:List 构造函数接受任何实现了 Collection 接口的数据结构,用于构建列表。
要从哈希映射中获取所有 键 到列表:
Map<String, Integer> map = new HashMap<String, Integer>();
List<String> keys = new ArrayList<>(map.keySet());
从哈希映射中获取所有值到列表:
Map<String, Integer> map = new HashMap<String, Integer>();
List<Integer> values = new ArrayList<>(map.values());
【讨论】:
这是我看到的这个问题的最佳答案!直奔主题。【参考方案4】:Java 8 解决方案用于生成像“key1: value1,key2: value2”这样的字符串
private static String hashMapToString(HashMap<String, String> hashMap)
return hashMap.keySet().stream()
.map((key) -> key + ": " + hashMap.get(key))
.collect(Collectors.joining(","));
并生成一个简单的列表作为列表收集
private static List<String> hashMapToList(HashMap<String, String> hashMap)
return hashMap.keySet().stream()
.map((key) -> key + ": " + hashMap.get(key))
.collect(Collectors.toList());
【讨论】:
【参考方案5】:假设我有键数据类型为 KeyDataType 的 Hashmap 并将值数据类型作为 ValueDataType
HashMap<KeyDataType,ValueDataType> list;
添加您需要的所有项目。 现在您可以将所有 hashmap 键检索到列表中。
KeyDataType[] mKeys;
mKeys=list.keySet().toArray(new KeyDataType[list.size()]);
所以,现在你在数组 mkeys[] 中获得了所有键
您现在可以通过调用检索任何值
list.get(mkeys[position]);
【讨论】:
【参考方案6】:既然已经有工作要做,为什么还要重新发明***。 Map.keySet()
方法为您提供 Map 中所有键的 Set。
Map<String, Integer> map = new HashMap<String, Integer>();
for (String key: map.keySet())
System.out.println("key : " + key);
System.out.println("value : " + map.get(key));
另外,你的第一个 for 循环在我看来很奇怪:-
for(int k = 0; k < list.size(); k++)
map = (HashMap)list.get(k);
您正在遍历您的列表,并将每个元素分配给相同的 reference - map
,这将覆盖所有以前的值。您将拥有的只是列表中的最后一张地图。
编辑:-
如果您想要地图的键和值,您也可以使用entrySet
。那对你来说会更好:-
Map<String, Integer> map = new HashMap<String, Integer>();
for(Entry<String, Integer> entry: map.entrySet())
System.out.println(entry.getKey());
System.out.println(entry.getValue());
附言:-
你的代码在我看来很混乱。我建议,把那段代码放在一边,再想想你的design
。目前,就代码而言,很难理解它试图做什么。
【讨论】:
如果循环中的代码调用get
,entrySet
是迭代映射中元素的更好方法
@RohitJain 很抱歉这么晚才回复,发布问题后没有机会。我想做的是从地图中获取所有值。正如我在帖子中所说,Hashmap 有 2 个键,它们通过 JSON 解析填充,然后添加到 ArrayList。我想检索 HashMap 中 2 个键的所有值,它位于 ArrayList 内。是的,我知道第一个“for”循环看起来很奇怪。但我试图获取 Arraylist 中的所有值,因为 Hashmap 只返回 2 个值的大小,并且 ArrayList 中有更多值。
@RohitJain 如果您在答案的上半部分显示解释“entrySet”的部分,而不是讨论“keySet”的部分,则效果会更好。只需交换部分的顺序即可。【参考方案7】:
这是非常古老的,但我偶然发现它试图找到另一个问题的答案。
我的问题是如何从数组列表中的两个映射键中获取值?
for (String key : map.keyset())
list.add(key + "|" + map.get(key));
地图大小总是返回值 2,这只是元素
我想你可能对HashMap
的功能感到困惑。 HashMap
只允许地图中的 1 对 1 关系。
例如,如果您有:
String TAG_FOO = "FOO";
String TAG_BAR = "BAR";
并尝试做这样的事情:
ArrayList<String> bars = ArrayList<>("bar","Bar","bAr","baR");
HashMap<String,String> map = new HashMap<>();
for (String bar : bars)
map.put(TAG_BAR, bar);
此代码最终会将键条目 "BAR"
设置为与列表中的最后一个项目 bars
相关联。
在您的示例中,您似乎对只有两个项目感到困惑,但您只记录了两个键,这使我相信您只是多次覆盖了每个键的字段。
【讨论】:
【参考方案8】:试试这个方法...
我正在考虑 HashMap
的 key 和 value 类型为 String
, HashMap<String,String>
HashMap<String,String> hmap = new HashMap<String,String>();
hmap.put("key1","Val1");
hmap.put("key2","Val2");
ArrayList<String> arList = new ArrayList<String>();
for(Map.Entry<String,String> map : hmap.entrySet())
arList.add(map.getValue());
【讨论】:
是的,现在很好。但是为什么要将所有地图值添加到列表中?真的需要吗?我觉得不行。任何时候你想要一个值,你都可以从 Map 本身中获取它。暂时还不清楚 OP 想要做什么。 @RohitJain 我已经在 ArrayList 中添加了值,因为 OP 想要这样......这就是问题的标题所说的...... @KumarVivekMitra .. 是的,根据 OP 的要求,这是正确的,但由于这不是正确的编码方式,您可以更好地添加一些建议。我只是为了改进这篇文章。 :) @RohitJain 我可以,但是我们应该知道程序员想用这些数据做什么......因为我不太清楚他想用这些数据做什么......我是暂时没有任何建议... @KumarVivekMitra .. 嗯。是的,那部分也是正确的。干杯:)【参考方案9】:将 i++ 放在循环末尾的某处。
在上面的代码中,数组的0位置被覆盖了,因为i没有在每次循环中递增。
仅供参考:以下内容进行了冗余搜索:
if(keys[i].equals(DATE))
date_value[i] = map.get(keys[i]);
else if(keys[i].equals(VALUE))
value_values[i] = map.get(keys[i]);
替换为
if(keys[i].equals(DATE))
date_value[i] = mapping.getValue();
else if(keys[i].equals(VALUE))
value_values[i] = mapping.getValue()
另一个问题是您将i
用于date_value
和value_values
。除非您打算在数组中包含空值,否则这是无效的。
【讨论】:
反对者愿意发表评论吗?在上面的代码中,数组的0位置被覆盖,因为i没有递增。 他没有在声明 i 的地方发布代码。如果它在一个 for 循环中,它可能已经被递增了。你不知道“i”是怎么回事,因为他没有发布任何关于“i”的信息。 @toadzky 请重新检查帖子。寻找int i = 0;
。他确实发布了声明 i
的代码。
@JohnB 对我迟到的回复感到抱歉。但是我的值 i 增加了。我没有意识到我没有复制它。现在将编辑我的代码。以上是关于从 ArrayList Java 中的 HashMap 键中检索所有值的主要内容,如果未能解决你的问题,请参考以下文章
java - 如何从java中的另一个ArrayList中删除一个ArrayList的元素?