ArrayList<HashMap<String, Object>>如何更新键值对和删除键值对?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList<HashMap<String, Object>>如何更新键值对和删除键值对?相关的知识,希望对你有一定的参考价值。

示例:
String[ ] name= new String[ ]"张三","李四","王五","赵六","霍七";
ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();
for( int i=0 ; i <name.length ; i++)
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("Name", name[ i ]);
arrayList.add(map);

请教大神们:
(问题1) 假如我要把“王五”改成“小明”该怎么更新这个键值???
(问题2) 假如我要删除“李四”该怎么写呢?

String[ ] name= new String[ ]"张三","李四","王五","赵六","霍七"; 
        ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();
        for( int i=0 ; i <name.length ; i++)
             HashMap<String, Object> map = new HashMap<String, Object>();
             map.put("Name", name[ i ]);
             arrayList.add(map);
        
        // 修改制定key
        for (HashMap<String, Object> hashMap : arrayList)
        
            if (hashMap.get("Name").equals("王五"))
            
                hashMap.put("Name", "小明");
            
        
        // 官方推荐的删除方法
        Iterator<HashMap<String, Object>> iterator = arrayList.iterator();  
        while(iterator.hasNext())  
          
            if(iterator.next().get("Name").equals("李四"))  
              
                iterator.remove();  
              
         
        System.out.println(arrayList);
        
        运行结果:
        [Name=张三, Name=小明, Name=赵六, Name=霍七]

参考技术A public static void main(String[] args)

String[ ] name= new String[ ]"张三","李四","王五","赵六","霍七";

ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();

for( int i=0 ; i <name.length ; i++)

HashMap<String, Object> map = new HashMap<String, Object>();

map.put("Name", name[ i ]);

arrayList.add(map);



HashMap<String, Object> remove = null ;

for (HashMap<String, Object> hashMap : arrayList)

if(hashMap.get("Name").equals("王五"))



hashMap.put("Name", "小明");



if(hashMap.get("Name").equals("李四"))



remove = hashMap;





arrayList.remove(remove);

System.out.println(arrayList);

当Arraylist增长时,带有ArrayList键的HashMap无法找到它

我的问题是,在我的代码的某些部分,我使用arraylist作为hashmap中的键

ArrayList<Integer> array = new ArrayList<Integer>();

然后我将我的数组作为哈希映射中的一个键(我需要它以这种方式我确定)

HashMap<ArrayList<Integer>, String> map = new HashMap<ArrayList<Integer>, String>();
map.put(array, "value1");

问题出在这里:当我向我的数组添加一些值然后我尝试使用相同的数组恢复数据时,哈希映射无法找到它。

array.add(23);
String value = map.get(array);

此时值为null而不是字符串“value1”我正在测试,我发现当数组列表增长时hashCode会发生变化,这是我问题的中心点,但我想知道如何解决这个问题。

答案

使用IdentityHashMap。然后,无论其内容(以及哈希代码)如何更改,相同的数组实例将始终映射到相同的值。

另一答案

您不能使用可变对象(即hashCode更改的对象)作为HashMap的关键字。看看你是否能找到其他东西作为钥匙。将集合映射到字符串有点不寻常;另一种方式更常见。

另一答案

它是一个奇怪的用例但如果你必须这样做,那么你可以对数组进行子类化并覆盖hashCode方法。

另一答案

在我看来,尝试做的事情有点添加。

我假设你要模拟的是一个由n个整数组成的可变长度键,并假设ArrayList的哈希值是一致的,但我不确定是这种情况。

我建议你要么继承ArrayList并覆盖hash()equals()方法,要么将HashMap包装在一个关键类中。

另一答案

我几乎肯定你不想那样做。你更有可能想要一个Map<String, List<Integer>>。但是,如果您绝对必须这样做,请使用持有者类:

public class ListHolder {
    private List<Integer> list = new ArrayList<Integer>();
    public List<Integer> getList() {return list;}
}

Map<ListHolder, String> map = new HashMap<ListHolder, String>;
另一答案

基本原因:当我们使用HashMap.put(k,v)时,它将数字k.hashCode(),以便它可以知道放在哪里。

它还可以通过这个数字找到值(k.hashCode());

您可以看到ArrayList.hashCode()函数,它位于AbstractList的抽象类中。显然,在我们添加一些对象之后,它会改变haseCode值。所以我们找不到值使用HashMap.get(K)并且没有hashCode为K的元素。

public int hashCode() {
    int hashCode = 1;
    for (E e : this)
        hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
    return hashCode;
}

以上是关于ArrayList<HashMap<String, Object>>如何更新键值对和删除键值对?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自 Arraylist<Hashmap<String,String>> 的 bundle 获取使用 putserializable 传递的值

java编程hashmap,arraylist

Java中HashMap,HashSet是线程安全的吗,ArrayList是线程不安全的那如何避免其出异常?

在Hashmap中获取arrayList的大小

当Arraylist增长时,带有ArrayList键的HashMap无法找到它

如何将 HashMap<String, ArrayList<String>> 存储在列表中?