当前位置:首页 > IT技术 > 编程语言 > 正文

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

Java List sublist

在java开发中,经常会有对列表的迭代循环遍历需求,其中出了查找、排重、统计意外就是截取需求,比如配置文件读取后找到相应的部分内容行等等

那么很容易会用到sublist方法,这是list自带的方法,我以前常用for循环去赋值给新的list 对象,但是昨天突发奇想试试sublist,结果出问题了。
我在read一个配置文件properties到list之后,有截取一部分行的需求,用了sublist,然后需要对sublist赋值的新的newlist对象进行add需求,结果
程序异常退出,没有报错,在junit里面try之后也看不到,突然感觉问题可能出在sublist方法,然后改回for遍历,ok了,很诡异。然后到网上查了一下
,真是不查不知道,一查吓一跳。也没太搞明白,搬运一下。

![](https://img2022.cnblogs.com/blog/1385728/202204/1385728-20220419095752501-1516346223.png)
这个图来自网络,他说sublist与原list是紧密关联的,所以我猜测我的add操作是对原list做了改变,那么我的sublist操作还是在对list遍历的for之内做的,
很多判断条件导致最终越界或者是异常了。
在此谨记一下。
点击查看代码
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进行循环查找满足条件的行
          // 正向
          if (fileContents.get(i).indexOf(start.replaceAll(":", "-")) > -1) {
            s = i;
            break;
          }
        }
        for (int i = fileContents.size() - 1; i > -1; i--) {//反向对fileContents进行循环查找满足条件的行
          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)的,结果无法再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/

开通会员,享受整站包年服务立即开通 >