當(dāng)前位置:首頁 > IT技術(shù) > 編程語言 > 正文

java list 坑一 sublist
2022-04-19 11:13:16

Java List sublist

在java開發(fā)中,經(jīng)常會有對列表的迭代循環(huán)遍歷需求,其中出了查找、排重、統(tǒng)計意外就是截取需求,比如配置文件讀取后找到相應(yīng)的部分內(nèi)容行等等

那么很容易會用到sublist方法,這是list自帶的方法,我以前常用for循環(huán)去賦值給新的list 對象,但是昨天突發(fā)奇想試試sublist,結(jié)果出問題了。
我在read一個配置文件properties到list之后,有截取一部分行的需求,用了sublist,然后需要對sublist賦值的新的newlist對象進(jìn)行add需求,結(jié)果
程序異常退出,沒有報錯,在junit里面try之后也看不到,突然感覺問題可能出在sublist方法,然后改回for遍歷,ok了,很詭異。然后到網(wǎng)上查了一下
,真是不查不知道,一查嚇一跳。也沒太搞明白,搬運(yùn)一下。

![](https://img2022.cnblogs.com/blog/1385728/202204/1385728-20220419095752501-1516346223.png)
這個圖來自網(wǎng)絡(luò),他說sublist與原list是緊密關(guān)聯(lián)的,所以我猜測我的add操作是對原list做了改變,那么我的sublist操作還是在對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++) {//對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>();//這個地方本來打算用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/

開通會員,享受整站包年服務(wù)立即開通 >