代码之家  ›  专栏  ›  技术社区  ›  ninjasense

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

  •  0
  • ninjasense  · 技术社区  · 14 年前

    我试图将一个对象添加到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数据,确保它们不是重复的。它似乎不断地添加第一个对象。

    3 回复  |  直到 11 年前
        1
  •  2
  •   Sean    14 年前

    responseData字符串或构造函数有问题。

    如果类接收到如下所示的响应数据对象

    String responseData = 
    "[{ 
    \"first_name\" : \"fred\" , 
    \"last_name\" : \"Nobody\"  
    }, 
    { 
    \"first_name\" : \"John\" , 
    \"last_name\" : \"Somebody\"  
    }]";
    

    那么你的联系人类应该是

    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中。你能展示一下你是如何把数组打印出来的吗?也许问题就在那里。

        2
  •  3
  •   polygenelubricants    14 年前

    一些快速提示:

    • 考虑以下事项 naming convention
    • 有效Java第2版,第65条:不要忽略异常
    • 有效Java第2版,第52条:通过对象的接口引用对象

    add 到一个 ArrayList 添加 任何 List :您可以 add(E) 单个元素或 addAll 一个完整的 Collection<? extends E> 到列表的末尾。如果要将元素添加到更特定的位置,也有采用索引的重载。


    关于混叠

    请始终记住,对象是引用类型,引用可以是别名。除非你明白这意味着什么,否则有些行为可能会让你大吃一惊。

    • 创建 列表 第3页 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 每次(意思是3个不同的 对象被创建时,它们仍然引用相同的对象 . 这类别名可能是问题的根源。

        3
  •  1
  •   Thirumalai Parthasarathi    11 年前

    Person.add(new Person(jsonPeople.getJSONObject(i)));
    

    应该是这样的

    People.add(new Person(jsonPeople.getJSONObject(i)));
    

    我不知道您首先是如何编译文件的,除非您有一个名为add(Person p)的静态方法和一个在Person类中接受Person(JSONObject j)的构造函数。