多维ArrayList出现重复数据异常行为,求助原因分析
问题分析与解决方案
你的问题核心在于复用了同一个FLines ArrayList对象,而不是每次循环都创建新的实例。让我一步步给你拆解:
为什么会出现重复结果?
你在循环外只创建了一次FLines:
final ArrayList<String> FLines = new ArrayList<String>();
之后每次循环里调用FLines.clear()再添加新数据,本质上是在修改同一个List对象的内容。而FoundRides中存储的是这个List对象的引用,不是副本。所以不管你调用add还是set,最终FoundRides里的所有元素都指向同一个FLines对象,当最后一次循环修改完FLines后,所有引用都会显示最后一次的内容。
修复后的代码
把FLines的创建移到循环内部,每次循环都生成新的ArrayList实例:
final ArrayList<List<String>> FoundRides = new ArrayList<>(); // 先初始化初始数据(如果需要的话) for (int i = 0; i < array.length(); i++) { FoundRides.add(Arrays.asList("Ankit", "Bohra", "Xyz")); }; // 移除循环外的FLines定义,移到循环内 for (int i = 0; i < array.length(); i++) { JSONObject line = array.getJSONObject(i); // 每次循环新建一个FLines对象 ArrayList<String> FLines = new ArrayList<>(); FLines.add(line.getString("destinatie")); FLines.add(line.getString("kmride")); FLines.add(line.getString("created_at")); // 用set替换对应位置的初始数据 FoundRides.set(i, FLines); }
简化版(如果不需要初始数据)
如果你不需要一开始的Ankit,Bohra,Xyz数据,可以直接在循环里创建新List并添加,省去初始化步骤:
final ArrayList<List<String>> FoundRides = new ArrayList<>(); for (int i = 0; i < array.length(); i++) { JSONObject line = array.getJSONObject(i); ArrayList<String> FLines = new ArrayList<>(); FLines.add(line.getString("destinatie")); FLines.add(line.getString("kmride")); FLines.add(line.getString("created_at")); FoundRides.add(FLines); }
修改后,每次循环都会生成独立的FLines实例,FoundRides里的每个元素都指向不同的List对象,各自保存对应循环的数据,就不会出现全部显示最后一条结果的问题了。
内容的提问来源于stack exchange,提问作者P.Bogdan
相关产品推荐
相关产品推荐

