Java List sublist
在java開發(fā)中,經(jīng)常會(huì)有對(duì)列表的迭代循環(huán)遍歷需求,其中出了查找、排重、統(tǒng)計(jì)意外就是截取需求,比如配置文件讀取后找到相應(yīng)的部分內(nèi)容行等等
那么很容易會(huì)用到sublist方法,這是list自帶的方法,我以前常用for循環(huán)去賦值給新的list 對(duì)象,但是昨天突發(fā)奇想試試sublist,結(jié)果出問題了。
我在read一個(gè)配置文件properties到list之后,有截取一部分行的需求,用了sublist,然后需要對(duì)sublist賦值的新的newlist對(duì)象進(jìn)行add需求,結(jié)果
程序異常退出,沒有報(bào)錯(cuò),在junit里面try之后也看不到,突然感覺問題可能出在sublist方法,然后改回for遍歷,ok了,很詭異。然后到網(wǎng)上查了一下
,真是不查不知道,一查嚇一跳。也沒太搞明白,搬運(yùn)一下。
![](https://img2022.cnblogs.com/blog/1385728/202204/1385728-20220419095752501-1516346223.png)
這個(gè)圖來自網(wǎng)絡(luò),他說sublist與原list是緊密關(guān)聯(lián)的,所以我猜測(cè)我的add操作是對(duì)原list做了改變,那么我的sublist操作還是在對(duì)list遍歷的for之內(nèi)做的,
很多判斷條件導(dǎo)致最終越界或者是異常了。
在此謹(jǐn)記一下。
點(diǎn)擊查看代碼
for (Object map : tList) {
String start = (String) ((Map) map).get("start");
String end = (String) ((Map) map).get("end");
String size = (String) ((Map) map).get("size");
// boolean b1 = false, b2 = false;
int s = 0, e = fileContents.size() - 1;
for (int i = 0; i < fileContents.size(); i++) {//對(duì)fileContents進(jìn)行循環(huán)查找滿足條件的行
// 正向
if (fileContents.get(i).indexOf(start.replaceAll(":", "-")) > -1) {
s = i;
break;
}
}
for (int i = fileContents.size() - 1; i > -1; i--) {//反向?qū)ileContents進(jìn)行循環(huán)查找滿足條件的行
if (fileContents.get(i).indexOf(end.replaceAll(":", "-")) > -1) {
e = i;
break;
}
}
// System.out.println(s + "#" + e);
List<String> subList = new ArrayList<String>();//這個(gè)地方本來打算用fileContents.sublist(s,e)的,結(jié)果無法再add()
for (int i = s; i < e + 1; i++) {
subList.add(fileContents.get(i));
}
// fileContents.subList(s, e < fileContents.size() - 1 ? e + 1 : e + 1);
try {
String s1 = subList.get(subList.size() - 2);
// System.out.println(s1);
subList.add(s1);
s1 = subList.get(subList.size() - 2);
subList.add(s1);
} catch (Exception e2) {
System.out.println(e2.getMessage());
}
cropsFileListMap.put("第" + (cont + 1) + "題", subList);
// System.out.print("第" + (cont + 1) + "題:");
// System.out.println(subList);
cont++;
本文摘自 :https://www.cnblogs.com/