java list.add(map)_Java中List与Map初始化的一些写法

Java的在还没有发现新写法之前时,我一直是这么初始化List跟Map:

代码如下 复制代码

//初始化List

List list = new ArrayList();

list.add(www.111cn.net);

list.add("string2");

//some other list.add() code......

list.add("stringN");

//初始化Map

Map map = new HashMap();

map.put("key1", "value1");

map.put("key2", "value2");

//.... some other map.put() code

map.put("keyN", "valueN");

好麻烦啊。。。。。有一天撸到这样的一种方式:

代码如下 复制代码

//初始化List

List list = new ArrayList(){{

add("string1");

add("string2");

//some other add() code......

add("stringN");

}};

//初始化Map

Map map = new HashMap(){{

put("key1", "value1");

put("key2", "111cn.Net");

//.... some other put() code

put("keyN", "valueN");

}};

虽然看起来没少写多少代码,但是个人觉得这种方式还是简洁多了很多,很流畅啊哈哈~

例,后现一聚小编测试了List两个实例更简单

法一:

利用Array与ArrayList的相互转换方法,代码如下:

代码如下 复制代码

ArrayList list = new ArrayList(Arrays.asList("Ryan", "Julie", "Bob"));

法二:

利用ArrayList的add方法完成初始化赋值,代码如下:

代码如下 复制代码

List list = new ArrayList(){{

add("A");

add("B");

}}

<think>嗯,我需要分析用户提供的这段Python代码。首先,我会通读一遍代码,了解整体结构和功能。看起来这段代码是用来绘制某个污染物的空间分布图,可能涉及地理数据的处理和可视化。 首先,用户导入了必要的库,比如matplotlib的LogNorm用于颜色映射的对数转换,mpl_toolkits中的Basemap用于地图绘制,还有cmaps来自定义颜色。接下来,代码初始化了一个二维列表lat_lon,大小为6000x7000,初始值为0。这可能代表经纬度网格上的污染物浓度。 然后,读取了一个CSV文件(zj_nox.csv),处理每一行数据。数据中的经度和纬度被转换为索引ilon和ilat,这里用了math.floor和round,可能是在将经纬度的小数值转换为整数索引,用于定位到lat_lon数组的相应位置。然后将第四列的值(污染物浓度)累加到对应的网格点上。 接下来是绘图部分。创建了一个figure和axes,使用Basemap设置了地图的范围,可能对应浙江地区。然后通过readshapefile加载了城市边界的数据。数据被重新组织为二维列表data,使用imshow绘制热力图,应用了LogNorm对数标准化,颜色映射使用precip3_16lev。颜色条通过make_axes_locatable添加到右侧,最后保存为高分辨率的PNG图片。 需要注意的问题可能包括:lat_lon的索引是否正确处理了经纬度的转换,Basemap的范围是否数据范围匹配,imshow的extent参数是否正确设置,以及LogNorm的参数是否合适。此外,数据读取和处理部分可能存在效率问题,尤其是对于大型的6000x7000数组,可能会消耗大量内存。还有CSV文件的路径是否正确,以及坐标转换是否有偏移错误等潜在问题。</think>以下是对这段Python代码的逐步分析: 1. **库导入**: ```python from matplotlib.colors import LogNorm # 对数颜色标准化 import matplotlib.pyplot as plt # 绘图基础库 from mpl_toolkits.axes_grid1 import make_axes_locatable # 颜色条布局工具 from mpl_toolkits.basemap import Basemap # 地理绘图库 import cmaps # 颜色映射库(可能来自WRF或自定义) import math # 数学计算 ``` 2. **数据容器初始化**: ```python lat_lon = [] for i in range(6000): # 创建6000行7000列的二维数组 lat_lon.append([0]*7000) # 初始化全零矩阵(更高效写法:lat_lon = [[0]*7000 for _ in range(6000)]) ``` *用于存储经纬度网格化污染数据,但存在内存浪费风险(约6000×7000×4字节≈168MB)* 3. **数据读取处理**: ```python with open(r'D:\pollution\data\zj_nox.csv', 'r', encoding='utf-8-sig') as df1: # 推荐使用with语句 for line in df1: parts = line.strip().split(',') lon = round(float(parts[2])*100, 2) # 经度处理(注意:可能存在精度问题) lat = round(float(parts[3])*100, 2) # 纬度处理 ilon = math.floor(lon) - 7000 # 经度索引转换(可能存在问题) ilat = math.floor(lat) # 纬度索引转换 value = float(parts[4].strip()) lat_lon[ilat][ilon] += value # 累加污染值 ``` **注意点**: - 经纬度转换逻辑可能存在问题(经度索引出现负值?) - 未处理数组越界风险(当ilat/ilon超出6000/7000范围时) 4. **地图绘制核心逻辑**: ```python basemap = Basemap( llcrnrlon=118.92, llcrnrlat=31.5, # 左下角经纬度(浙江北部) urcrnrlon=120.01, urcrnrlat=32.4 # 右上角经纬度 ) basemap.readshapefile(r'D:\pollution\city\city', 'city') # 加载城市边界 data = [[lat_lon[i][j] for j in range(7000)] for i in range(6000)] # 矩阵重组(可优化) cm = cmaps.precip3_16lev # 使用降水颜色映射(可能不适用于污染数据) im = plt.imshow(data, extent=(70, 140, 60, 0), # 显示范围(似乎Basemap范围不匹配) cmap=cm, norm=LogNorm(vmin=1, vmax=10000), # 对数标准化 interpolation='None' # 禁用插值 ) ``` 5. **颜色条添加**: ```python divider = make_axes_locatable(ax) cax = divider.append_axes('right', size='5%', pad=0.05) plt.colorbar(im, cax=cax) # 创建独立颜色条 ``` 6. **输出保存**: ```python plt.savefig(r'D:\pollution\pic\zj_nox.png', dpi=1000) # 超高分辨率输出 ``` **存在的主要问题**: 1. **坐标系统不一致**: - `Basemap`设置范围为$[118.92°, 120.01°] \times [31.5°, 32.4°]$ - `imshow`的extent参数却设置为$[70, 140] \times [0, 60]$(可能显示范围错误) 2. **索引计算问题**: - 经度索引计算:`ilon = math.floor(round(lon*100,2)) - 7000` - 当`lon=120°`时,`lon*100=12000 → ilon=12000-7000=5000` - 但数组宽度为7000,索引范围应为0-6999,可能导致越界 3. **内存效率问题**: - 6000×7000的二维列表初始化方式低效 - 推荐使用NumPy数组:`import numpy as np; lat_lon = np.zeros((6000,7000))` 4. **可视化效果问题**: - 使用降水颜色映射`precip3_16lev`可能不适合污染数据展示 - 高dpi(1000)输出可能导致文件过大,通常300-600dpi已足够 **改进建议**: 1. 使用NumPy进行数组操作 2. 验证坐标转换公式的正确性 3. 统一Basemap范围imshow显示范围 4. 添加异常处理(文件读取、数组越界) 5. 使用更适合污染数据的颜色映射(如YlOrRd)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值