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));
}
}