合并两个没有重复的对象列表

时间:2018-12-04 14:13:56

标签: java android

我有三个对象类:

public class Section{
    private Integer id;
    private List<Program> programs;
}

public class Program{
    private String title;
    private Integer id;
    private List<Broadcast> broadcasts = null;
}

public class Broadcast {
    private Integer id;
    private String title;
}

我有Section对象的两个列表:List<Section> oldSectionsList<Section> newSections。我需要检查oldSections是否包含newSections列表中的所有节,以确定我必须比较id值。如果没有,那么我需要将该部分添加到oldSections中,如果需要,则必须对“节目和广播”进行相同的检查。

我试图遍历所有部分,程序和广播,但这似乎不是一个好的解决方案。最好的方法是什么?

    private void updateSections(List<Section> oldSections, List<Section> newSections){
        for(Section newSection: newSections){
            boolean alreadyAdded = false;
            for(Section oldSection: oldSections){
                if(newSection.getId() == oldSection.getId()){
                    alreadyAdded = true;
                }
            }
            if(!alreadyAdded){
                oldSections.add(newSection);
            } else {
                //HERE I HAVE TO COMPARE PROGRAMS AND THEN BROADCASTS
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

集合是可以帮助您避免重复的列表。

  

您可以简单地覆盖 Java Bean / POJO 对象的等于和hashCode 方法   并使用集。这样,重复的条目将被拒绝,您不会   需要再合并您的数据。您的列表元素始终是唯一的。

看看这个线程,看看如何在Java中实现Set-> Verify there is a combination of unique string

答案 1 :(得分:0)

您还可以使用Java 8合并没有重复项的列表。

public class Test {
    public static void main(String[] args) {
        List<Student> list1 = Arrays.asList(new Student("a", 1), new Student("b", 2), new Student("f", 3));
        List<Student> list2 = Arrays.asList(new Student("b", 4), new Student("c", 5), new Student("f", 6));
        List<Student> list3 = Arrays.asList(new Student("b", 7), new Student("d", 8), new Student("e", 9));
        List<Student> dogs = new ArrayList<>(Stream.of(list1, list2, list3).flatMap(List::stream)
                .collect(Collectors.toMap(Student::getName, d -> d, (Student x, Student y) -> x == null ? y : x)).values());
        dogs.forEach(System.out::println);
    }
}

class Student {
    String name;
    int id;

    public Student(String name, int id) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Student{" + "name='" + name + '\'' + ", id=" + id + '}';
    }
}