仅更新List <object>中的对象,仅影响特定字段。 (合并)

时间:2016-05-26 08:47:39

标签: java android

我有一个对象列表:

@Getter
@Setter
class Cat {
    int id;
    int legs;
    int head; 
} 

List<Cat> catsLegs = new ArrayList<>();

我用一些数据填写此列表:

for (int i = 0; i < 10; i++) {
    Cat cat = new Cat();
    cat.setId(i);
    cat.setLegs(i + i);
    cats.add(cat);
}

然后我有另一个清单

List<Cat> catsHeads = new ArrayList<>();

我用一些数据填写此列表:

for (int i = 0; i < 10; i++) {
    Cat cat = new Cat();
    cat.setId(i);
    cat.setHead(i*i);
    cats.add(cat);
}

然后我想合并这两个列表和如果id相等,那么Cats是相等的。

@Override
    public boolean equals(Object o) {
        if (!(o instanceof Cat)) {
            return false;
        }

        Cat that = (Cat) o;
        return this.id.equals(that.id);
    }

还有3个领域,但这是一个基本原则。

非常感谢。

3 个答案:

答案 0 :(得分:1)

  1. 将您的猫放入Map<Integer, Cat>
  2. 获取生成的Map
  3. 的值
  4. 如果您确实需要List根据Map
  5. 的值创建新列表

    以下是如何合并列表,以便能够覆盖:

    Map<Integer, Cat> map = new HashMap<>();
    for (Cat cat : catsLegs) {
        map.put(cat.getId(), cat);
    }
    for (Cat cat : catsHeads) {
        map.put(cat.getId(), cat);
    }
    Collection<Cat> cats = map.values();
    // If you really need a List, you create a new one as next
    List<Cat> catsList = new ArrayList<>(cats);
    

答案 1 :(得分:0)

最简单的方法是循环查看猫的列表并检查if (catHead.id == catTail.id)但这并不是很酷。

更好的解决方案是将数据存储在HashMap而不是List中。这样,您可以使用哈希键作为ID,将哈希值作为Cat对象。以这种方式检索对象要容易得多,当然要快得多。

答案 2 :(得分:0)

这就是我所做的。它传输所有对象头,我有新鲜的catList.size(),因为我不希望旧的currentCats对象在最终列表中。

public static void updateCats(List<Cat> catsFromServer) {
            setAllCatsLegs(catsFromServer);
            List<Cat> currentCats = getAllCats();
            for (Cat currentCat : currentCats) {
                for (Cat fromServer : catFromServer) {
                    if (currentCat.equals(fromServer)) {
                        fromServer.setHeads(currentcat.getHeads());
                    }
                }
            }
            Contact.saveMultiple(contactsFromServer);
        }

upd:

List<Cat> currentCats = getAllCats();
        for (Cat cat : catsFromServier) {
            int index = currentCats.indexOf(cat);
            if (index != -1) {
                cat.setHeads(currentCats.get(index).getHeads);
            }
        }