Java ArrayList.clear()正在更新列表的以前值<&燃气轮机;

Java ArrayList.clear()正在更新列表的以前值<&燃气轮机;,java,android,arraylist,Java,Android,Arraylist,我正在从服务器获取JSONArray。我得到的JSON格式如下 [ { "area_name":"abc", "coordinates":[ { "lat":1.123, "lng":2.123, }, { "lat":1.123, "lng":2.123, }, . . ] }, { . . . } ] 为了在地图上绘制区域,我将区域添加到areaList中,并在Coo

我正在从服务器获取
JSONArray
。我得到的
JSON
格式如下

[ {
   "area_name":"abc",
   "coordinates":[
     {
     "lat":1.123,
     "lng":2.123,
     },
     {
     "lat":1.123,
     "lng":2.123,
     },
     .
     .
     ]
},
{
.
.
.
}
] 
为了在地图上绘制区域,我将区域添加到
areaList
中,并在
Coordinates List

ArrayList<HashMap<String, LatLng>> coordinatesList; // initialised in onCreate
List<ArrayList<HashMap<String, LatLng>>> areaList; // initialised in onCreate

for (int i = 0; i < areaArray.size(); i++) {
     coordinatesList.clear();
     //coordinatesList = new ArrayList<>();
     //  parsing of json and other non-related stuff

      for (int j =0; j < pointsArray.size(); j++) {
          // Getting data from json and saving to hashmap and adding to coordinatesList
          coordinatesList.add(pointsHashMap);
     }

     areaList.add(coordinatesList);
}
对于
i
i的任何值,我通过
areaList.add(CoordinationsList)获得最后一个附加值。将替换
区域列表中以前添加的所有值

但是当我评论
coordinatesList.clear()时和取消注释
coordinatesList=new ArrayList()一切正常


有人能详细解释一下,为什么会这样

在循环的每次迭代中,您肯定需要向areaList添加一个新的ArrayList。现在,每次通过循环,您都要将同一个Coordinates列表实例添加到areaList。同一个实例在列表顶部被清除


将同一个CoordinationsList添加到areaList不会复制元素,它只会将引用添加到现有列表。

因为每次在循环中不满足arraylist时,都会尝试在onCreate()中不满足arraylist

coordinatesList = new ArrayList<>();
Coordinates列表=新的ArrayList();

因为这是在我们的
onCreate
方法中初始化的,一旦活动被推到backbackback,就会调用该方法<代码>数组列表坐标列表


现在,您的Coordinates列表的实例在整个
/
活动
中有效

因此,如果您想在调用函数以实现CoordinationList的同时始终获得新结果,您需要重新初始化
ArrayList
对象,或者清除它以获得新的结果。

public void onCreate(Bundle b){
    super(b);

    parseResponse();
}

private final void parseResponse(){

    areaList = new ArrayList<ArrayList<HashMap<String, LatLng>>>>(jsonArray.length());
    for(int i=0;i<areaList.size();i++){

        List<HashMap<String,LatLng>> coordinatesList = new ArrayList<>();
        //  parsing of json and other non-related stuff

        for (int j =0; j < pointsArray.size(); j++) {
            // Getting data from json and saving to hashmap and adding to coordinatesList
            coordinatesList.add(pointsHashMap);
        }

     areaList.set(i,coordinatesList);
}
我认为如果您声明了一个封装了相关细节的
Area
类,那么会更干净。例如:

public class Area{
   private String name;
   private List<LatLng> coordinates; 

   public Area(String name, List<LatLng> coordinates){//...}
}
公共类区域{
私有字符串名称;
私人名单协调;
公共区域(字符串名称、列表坐标){/…}
}
这将使活动中的代码减少为:

List<Area> areaList; 

private final void parseResponse(){

    areaList = new ArrayList<Area>(jsonArray.length());
    for(int i=0;i<areaList.size();i++){

        List<LatLng> coordinatesList = new ArrayList<>();
        //  parsing of json and other non-related stuff
        // Getting area_name and coordinates from json

         areaList.add(new Area(areaName,coordinatesList));
    }

}
列表区域列表;
private final void parseResponse(){
areaList=newArrayList(jsonArray.length());

对于(int i=0;i将一个项目添加到数组列表中并不会复制它。您正在一次又一次地添加同一个列表。只需在循环中声明Coordinates list;每次迭代都创建一个新列表。嗯,啊,我真是太傻了。我认为整晚都在工作会付出代价。是的;但是最好将其声明为局部变量,这样您就不会太傻了使用循环完成后最后一次迭代的内容进行ft。
public class Area{
   private String name;
   private List<LatLng> coordinates; 

   public Area(String name, List<LatLng> coordinates){//...}
}
List<Area> areaList; 

private final void parseResponse(){

    areaList = new ArrayList<Area>(jsonArray.length());
    for(int i=0;i<areaList.size();i++){

        List<LatLng> coordinatesList = new ArrayList<>();
        //  parsing of json and other non-related stuff
        // Getting area_name and coordinates from json

         areaList.add(new Area(areaName,coordinatesList));
    }

}