任何人都可以告诉我为什么我的旧列表中只有新列表中应该存在的所有值。

时间:2015-03-18 17:58:29

标签: java android arraylist iterator

  1. 我在tmp中存储一个列表,然后在列表中添加新值。
  2. 刷新时我将旧列表与新列表进行比较。
  3. 如果新列表有新条目,则生成通知,但每次我在旧列表中找到所有值。

    public void populateList(String result) {
        ArrayList<User> tmp;
        tmp = list;
        list.clear();
        try {
            JSONArray jsonArray = new JSONArray(result);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject json_data = jsonArray.getJSONObject(i);
                String NAME = json_data.getString(StaticMember.NAME);
                String STATUS = json_data.getString(StaticMember.STATUS);
                list.add(new User(NAME, STATUS));
            }
            ArrayList tmpN = list;
            compare(tmp, tmpN);
            CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(), android.R.layout.simple_list_item_1, list);
            lv.setAdapter((customAdapter));
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public void compare(ArrayList list_old, ArrayList list_new) {
        try {
            Iterator<User> iterator_old = list_old.iterator();
            Iterator<User> iterator_new = list_new.iterator();
    
            while (iterator_new.hasNext()) {
                User user_new = iterator_new.next();
                boolean NEW = true;
    
                while (iterator_old.hasNext()) {
                    User user_old = iterator_old.next();
                    //Log.i(":N:"+user_new.getUsername(), ":O:"+user_old.getUsername());
                    if (user_new.getUsername().equals(user_old.getUsername())) {
                        NEW = false;
                        break;
                    }
                }
                if (NEW) {
                    generateNotification(getApplicationContext(), user_new.getUsername() + " has been added.");
                    Log.i("True", "Changed");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

1 个答案:

答案 0 :(得分:6)

执行tmp = list后,您不会将list的值存储在tmp中。相反,您只需使tmp引用list引用的同一对象。稍后,当您修改list时,您将修改tmp引用的内容。

最初,list引用用户列表:

 list -> [user0, user1, user2]

tmp = list之后,listtmp都会引用相同的列表:

 list -> [user0, user1, user2] <- tmp

当您拨打list.clear()时,清除原始列表:

 list -> [] <- tmp

当您向list添加新元素时,您将修改原始列表:

 list -> [newuser0] <- tmp

如果您需要在list中存储tmp的副本,则需要在修改旧列表之前创建新列表:

List<User> tmp = new ArrayList<>(list);

请注意,两个列表中存储的User对象仍然相同,因此如果您从一个列表中修改一个对象,它将反映在另一个列表中。