map赋值错误,指向问题解决

36 篇文章 0 订阅

场景:查询回一个List<Map<String,Object>>集合,想在符合条件的map对象加一个字段(put一个属性)作为标识符

if(dateToString1.equals(dis.get("DRUGDATE"))){
	dis.put("oneDay", 1); //此处为符合条件加入的标识符
}

结果,List集合中的所有当前map都被处理了,各种new对象,都未解决;

问题原因是:指向问题:修改对象指向的是一个对象地址

解决办法:循环list时,将对象每次都克隆一次,putAll();

for(int j=0;j<drugOrderList.size();j++){
				Map<String,Object> dis = new HashMap<>();
				dis.putAll(drugOrderList.get(j)); // 就加这一行代码,解决指向问题
				String format = "yyyy-MM-dd";
				//当前时间
				Date nowTime = new SimpleDateFormat(format).parse(dateToString1);
				//开始时间
				Date startTime = new     SimpleDateFormat(format).parse(dis.get("ORDER_TIME").toString());
				//结束时间
				Date endTime = new SimpleDateFormat(format).parse(dis.get("STOP_TIME").toString());
				if(isEffectiveDate(nowTime,startTime,endTime)){

					if(dateToString1.equals(dis.get("DRUGDATE"))){
							dis.put("oneDay", 1);
					}
 					day.add(dis);
			    }
		    }
	returnList.add(day);

这个问题太容易忽略,耽误了一下午,特此记录。

我不了解 `kbj_map`,不过根据您的描述,可能是出现了一些概念混淆。 在 Linux 内核中,字符设备对象用 `struct cdev` 结构体来表示。每个 `struct cdev` 结构体都包含了字符设备的设备号、字符设备操作函数、等待队列、设备链表指针等信息。 而 `void *data` 是一个指向未知类型数据的指针,它并不是专门用于表示字符设备对象的指针。因此,将 `void *data` 赋值为 `chardev` 可能会引起一些问题,因为 `chardev` 不是一个通用的数据类型,而是一个自定义的数据类型。 如果您想将字符设备对象保存在一个哈希表或映射表中,可以考虑使用 `struct cdev` 结构体的指针作为,而不是将 `void *data` 直接赋值为 `chardev`。例如: ```c #include <linux/cdev.h> #define DEVICE_NUM 2 static struct cdev cdevs[DEVICE_NUM]; static struct kobj_map *map; int init_module(void) { int i; // 初始化字符设备对象 for (i = 0; i < DEVICE_NUM; i++) { cdev_init(&cdevs[i], &fops); cdevs[i].owner = THIS_MODULE; } // 注册字符设备对象 if (cdev_add(&cdevs[0], MKDEV(0, 0), 1) < 0) goto err; if (cdev_add(&cdevs[1], MKDEV(0, 1), 1) < 0) goto err; // 创建映射表 map = kobj_map_init_empty(); if (!map) goto err; // 将字符设备对象添加到映射表中 if (kobj_map_add(map, MKDEV(0, 0), &cdevs[0])) goto err; if (kobj_map_add(map, MKDEV(0, 1), &cdevs[1])) goto err; return 0; err: // 错误处理 return -1; } void cleanup_module(void) { // 从映射表中删除字符设备对象 kobj_map_remove(map, MKDEV(0, 0)); kobj_map_remove(map, MKDEV(0, 1)); // 销毁映射表 kobj_map_release(map); // 删除字符设备对象 cdev_del(&cdevs[0]); cdev_del(&cdevs[1]); } ``` 上面的代码使用 `kobj_map` 数据结构来实现设备号和字符设备对象之间的映射关系,其中每个键对的都是 `struct cdev` 结构体的指针。映射表的创建和销毁在模块初始化和清理函数中完成,通过 `kobj_map_add()` 和 `kobj_map_remove()` 函数向映射表中添加和删除键对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值