[英]Correct way to add objects to an ArrayList
我试图将一个对象添加到arraylist,但是当我查看数组列表的结果时,它会不断将相同的对象不断添加到arraylist。 我想知道实现此目标的正确方法是什么。
public static ArrayList<Person> parsePeople(String responseData) {
ArrayList<Person> People = new ArrayList<Person>();
try {
JSONArray jsonPeople = new JSONArray(responseData);
if (!jsonPeople.isNull(0)) {
for (int i = 0; i < jsonPeople.length(); i++) {
People.add(new Person(jsonPeople.getJSONObject(i)));
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
}
return People;
}
我已经仔细检查了JSONArray数据,并确保它们不是重复的。 似乎不断重复添加第一个对象。
一些快速提示:
话虽如此,您可以像add
到ANY List
一样add
到ArrayList
:您可以add(E)
单个元素或addAll
整个Collection<? extends E>
Collection<? extends E>
到列表的末尾。 如果要将元素添加到更特定的位置,也有需要索引的重载。
永远记住对象是引用类型,并且引用可以是别名。 除非您了解这意味着什么,否则某些行为可能会让您感到惊讶。
此代码段显示了以下示例:
AtomicReference
实例的List
,这些实例都引用相同的AtomicInteger
。 AtomicInteger
递增时,所有AtomicReference
看到此效果 AtomicReference
设置为引用第二个AtomicInteger
(在此示例中,并发没有特定的细节)
import java.util.concurrent.atomic.*;
//...
List<AtomicReference<AtomicInteger>> refs =
new ArrayList<AtomicReference<AtomicInteger>>();
AtomicInteger counter = new AtomicInteger();
for (int i = 0; i < 3; i++) {
refs.add(new AtomicReference<AtomicInteger>(counter));
}
// we now have 3 AtomicReference,
// but only 1 AtomicInteger
System.out.println(refs); // [0, 0, 0]
counter.incrementAndGet();
System.out.println(refs); // [1, 1, 1]
refs.get(1).set(new AtomicInteger(9));
System.out.println(refs); // [1, 9, 1]
// we still have only 3 AtomicReference,
// but we've also created a second AtomicInteger
counter.incrementAndGet();
System.out.println(refs); // [2, 9, 2]
请注意,即使每次都为List.add
使用new AtomicReference
(意味着总共创建了3个不同的AtomicReference
对象),它们仍然引用相同的AtomicInteger
。 这种混叠可能是问题的根源。
responseData字符串或构造函数有问题。
如果该类收到如下响应数据对象
String responseData =
"[{
\"first_name\" : \"fred\" ,
\"last_name\" : \"Nobody\"
},
{
\"first_name\" : \"John\" ,
\"last_name\" : \"Somebody\"
}]";
然后您的Contact类应该看起来像
public class Contact {
String fname;
String lname;
public Contact(JSONObject obj){
System.out.println(obj);
try {
fname = (String)obj.get("first_name");
lname = (String)obj.get("last_name");
} catch (JSONException e) {
e.printStackTrace();
}
}
//get and set methods
}
根据您的逻辑,没有理由让相同的记录出现两次。 确保您的JSON字符串具有正确的输入格式。我建议在应用程序中添加更多System.out或Log4j调用以确定每个步骤。 最坏的情况是通过调试会话逐步遍历应用程序。
PS-我通过添加上面的代码构建了您的应用,并且效果很好。 因此,您可以正确地将元素添加到ArrayList中。 您还能显示出如何打印出阵列吗? 也许问题就在那里。
你不觉得
Person.add(new Person(jsonPeople.getJSONObject(i)));
应该像
People.add(new Person(jsonPeople.getJSONObject(i)));
我不知道如何首先编译文件,除非您有一个名为add(Person p)的静态方法和一个在Person类中接受Person(JSONObject j)的构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.