如何将二维ArrayList转为一维ArrayList及解决XML数据覆盖问题
嘿,我来帮你搞定这个二维ArrayList转一维的问题,顺便也给你提个小建议解决XML覆盖的坑😉
解决二维ArrayList转一维的问题
首先,假设你的二维ArrayList是ArrayList<ArrayList<YourDataType>> twoDList,一维列表是ArrayList<YourDataType> oneDList。核心思路就是遍历二维里的每一个子列表,把它们的元素全部“搬”到一维列表里。这里有几种实用的方法:
方法1:普通循环遍历(直观好理解)
这是最直接的方式,逐个遍历二维列表中的每个子ArrayList,再用addAll()把整个子列表的元素一次性添加到一维列表里——比逐个add()元素高效多了:
// 替换成你实际的类型,比如String或者自定义的Position类 for (ArrayList<YourDataType> subList : twoDList) { oneDList.addAll(subList); }
如果担心二维列表里有null的子列表,记得加个非空判断避免空指针:
for (ArrayList<YourDataType> subList : twoDList) { if (subList != null) { oneDList.addAll(subList); } }
方法2:Java 8+ 流操作(简洁优雅)
如果你用的是Java 8及以上版本,用流来扁平化二维列表会更简洁,一行代码就能搞定:
// 直接生成新的一维列表 oneDList = twoDList.stream() .flatMap(List::stream) .collect(Collectors.toCollection(ArrayList::new));
要是你想把元素加到已有的一维列表里,也可以这么写:
twoDList.stream() .flatMap(List::stream) .forEach(oneDList::add);
顺便提下XML覆盖的优化建议
既然你提到重新打开程序时XML会被覆盖,其实除了先合并ArrayList再写入,还有个更直接的思路:不要直接覆盖整个XML文件,而是先读取原有XML的内容,把新的<savedPosition>节点追加到对应的父节点下,再把整个文档写回文件。这样就不用先把所有历史数据转成ArrayList再合并,能减少中间步骤。比如用DOM解析器,找到存储<savedPosition>的父节点,把新节点append进去,再序列化整个文档到文件,就能完美避免覆盖原有数据啦。
内容的提问来源于stack exchange,提问作者McRoland
相关产品推荐
相关产品推荐

