比较两个列表的内容

时间:2016-09-20 15:51:57

标签: java

我想比较两个列表的内容,特别是存储在这两个列表中的自定义对象的某种方法,我们称之为#getID()

我的方法是让方法告诉我这两个列表是否包含具有相同ID的相同条目。

List<CustomObject> firstList;
List<CustomObject> secondList;

循环遍历firstList中的每个条目,在其上调用getID()并查看secondList中是否有一个对象返回getID()的相同值。

进行此项检查的有效方法是什么?最好使用Java 8流,它们在这里非常有用。

3 个答案:

答案 0 :(得分:1)

如果两个列表都已排序,您可以这样做:

public boolean equalsLists(List<YourClass> a, List<YourClass> b) {
    if (a.size() != b.size()) {
        return false;
    }
    for (int i = 0; i < a.size(); i++) {
        if (!a.get(i).getId().equals(b.get(i).getId()) {
             return false;
        }
    }
    return true;
}

如果您可以对元素进行排序,请对它们进行排序并应用之前显示的相同算法。

否则算法的效率取决于很多因素:

  • 两个列表可以等于多久
  • 列表有多长
  • 如果元素可以在列表中出现多次
  • 如果可以合理安全地将所有元素应用于所有元素,如果两个列表不相等则在逐个元素比较之前使用此函数(例如,如果你有不同大小的字符串来检查你可以计算每个列表的每个id的字符数,如果它们不同,你肯定可以返回false)

答案 1 :(得分:1)

假设两个列表都已排序,您可以使用comparator

        Comparator<List<CustomObject>> myComp = new Comparator<List<CustomObject>>() {
            @Override
            public int compare(List<CustomObject> customObjectList, List<CustomObject> t1) {
                for (int i = 0; i < customObjectList.size(); i++) {
                    if (customObjectList.getId().equals(t1.getId())) {
                        // Do your logic here
                    }
                }
            }
        };

        myComp.compare(list1, list2);

这是&#34; Java&#34;做事的方式。如果列表的大小不匹配,您将不得不练习某种防御性编程。如果未对它们进行排序,则可以在比较这两个列表之前使用Collections.sort

答案 2 :(得分:0)

获取重复元素的一种方法是使用Map,如下所示。

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

public class SomeClass {
    protected class Component {
        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public Component(String id, String description) {
            super();
            this.id = id;
            this.description = description;
        }

        String id;
        String description;

        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "Id " + this.getId();
        }

    }

    public static void main(String[] args) {

        Component component1 = new SomeClass().new Component("1", "One");
        Component component2 = new SomeClass().new Component("2", "One");
        Component component3 = new SomeClass().new Component("1", "One");
        Component component4 = new SomeClass().new Component("3", "Three");
        Component component5 = new SomeClass().new Component("4", "Four");
        List<Component> list1 = new ArrayList<Component>();
        list1.add(component1);
        list1.add(component2);

        List<Component> list2 = new ArrayList<Component>();
        list1.add(component1);
        list1.add(component2);

        list2.add(component3);
        list2.add(component4);
        list2.add(component5);

        Map<String, Component> result = list2.stream().collect(Collectors.toMap(Component::getId, Function.identity()));

        Set<Component> repeated = list1.stream().filter(component -> result.containsKey(component.getId()))
                .collect(Collectors.toSet());
        repeated.forEach(System.out::println);
    }

}