java - 谁能告诉我为什么我的旧列表包含所有应该只存在于新列表中的值。?

标签 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();
        }
    }
    

最佳答案

当您执行 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

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

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

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

关于java - 谁能告诉我为什么我的旧列表包含所有应该只存在于新列表中的值。?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29129352/

相关文章:

java - 具有不同错误消息的相同异常类型

android - 修复了 jQuery Mobile 中的标题滚动/拖动

Android AOSP 5.1 禁用/删除 wifi 代理

java - 在Java中将集合的集合转换为列表的列表

java.sql.BatchUpdateException : ORA-00001: unique constraint while we generating primary key

java - 应用程序警报导致奇怪的错误,直到我按下后退按钮

安卓模拟器无法运行

java - 在对象数组中搜索特定字符串

java - Libgdx 矩形数组

java - JEdi​​torPane 正在删除 CSS 字体样式