我正在尝试将一个对象添加到一个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数据,并确保它们不是重复数据。它似乎一遍又一遍地添加第一个对象。
答案 0 :(得分:3)
一些快速提示:
话虽如此,您可以add
ArrayList
add
与List
ANY List
相同:您可以{{3单个元素或add(E)
整个addAll
到列表的末尾。如果要将元素添加到更具体的位置,还有一些带有索引的重载。
始终记住对象是引用类型,引用可以是别名。除非你理解这意味着什么,否则一些行为可能会让你感到惊讶。
此代码段显示了一个示例:
AtomicReference
个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]
(在这个例子中没有关于并发的具体内容)
new AtomicReference
请注意,即使List.add
每次都用于AtomicReference
(意味着总共创建了3个不同的AtomicInteger
个对象),它们仍然指的是同一个{{1}} 。这种别名可能是您问题的根源。
答案 1 :(得分:2)
responseData字符串或构造函数有问题。
如果类接收到类似于以下
的响应Data对象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 - 我通过添加上面的代码构建了你的app,它运行正常。因此,您可以正确地将元素添加到ArrayList中。你能说明你如何打印阵列吗?也许问题就在那里。
答案 2 :(得分:1)
你不觉得
Person.add(new Person(jsonPeople.getJSONObject(i)));
应该像
People.add(new Person(jsonPeople.getJSONObject(i)));
我首先编译文件,除非你有一个名为add(Person p)的静态方法和一个在Person类中接受Person(JSONObject j)的构造函数。