繁体   English   中英

将对象添加到ArrayList的正确方法

[英]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数据,并确保它们不是重复的。 似乎不断重复添加第一个对象。

一些快速提示:

  • 考虑以下命名约定 变量名以小写字母开头。
  • 有效的Java 2nd Edition,项目65:不要忽略异常
  • 有效的Java 2nd Edition,项目52:通过其接口引用对象

话虽如此,您可以像addANY List一样addArrayList :您可以add(E)单个元素或addAll整个Collection<? extends E> Collection<? extends E>到列表的末尾。 如果要将元素添加到更特定的位置,也有需要索引的重载。


关于别名

永远记住对象是引用类型,并且引用可以是别名。 除非您了解这意味着什么,否则某些行为可能会让您感到惊讶。

此代码段显示了以下示例:

  • 创建3个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM