gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:15:30 25 4
gpt4 key购买 nike

  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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com