检查两个不同的ArrayLists是否相等

时间:2015-03-29 01:37:10

标签: java arrays object arraylist

我有一个String类型的Array List和一个Person类型的Array List。 Person是一个只包含一个包含该名称的String的对象。

ArrayList<Person> people = new ArrayList<Person>();
ArrayList<String> names = new ArrayList<String>();

我们说我这样做,

names.add("Josh");
people.add(new Person("Josh");

假设创建一个新的Person对象将名称设置为&#34; Josh&#34;,并假设Person类具有该名称的get方法。

有没有办法检查名称Array List是否包含名为Josh的人。

我唯一能想到的就是这个,

for(int i = 0; i < names.size(); i++){
    if(names.get(i).equals(people.get(i).getName)){
        return true;
    } // end if     
} // end for

现在,如果人员数组列表和名称数组列表包含多个元素,如何检查名称数组列表中的字符串是否包含其中一个人员的名称?我会用这个吗?

 for(int i = 0; i < names.size(); i++){
    for(int j = 0; j < people.size(); j++){
        if(names.get(i).equals(people.get(j).getName)){
            return true;
        } // end if
    }  // end nested for    
 } // end for

或者这甚至不可能,因为数组列表包含不同的对象?

5 个答案:

答案 0 :(得分:4)

是的,您可以按照建议的方式实施。为了使其更简洁,您还可以使用for-each构造并切换循环(namescontains内循环):

for (Person p : people) {
    if (names.contains(p.getName()) {
       return true;
    }
 }

答案 1 :(得分:2)

在Java 8中,您可以使用Streams.anyMatch()

执行此操作

如果true中的Person名称位于people,则返回names

people.stream().anyMatch(person -> names.contains(person.getName());

请注意,如果namesSet<String>而不是List<String>,则会更快。

答案 2 :(得分:0)

首先检查列表的长度是否相同 然后检查一个中的每个元素是否包含在另一个中。 当然,这假设名称在列表中是唯一的。

if (people.size () != names.size ()){
    return false;
}
for(Person p : people) {
    if(!names.contains(p.getName())){
         return false;
    }
}
return true;

答案 3 :(得分:0)

可能的解决方案:

解决方案1 ​​:最简单的方法

public boolean check(List<Person> people, List<String> names) {
    for(Person person : people) {
        if (names.contains(p.getName()) {
            return true;
        }
    }
}

注意:如果列表中有很多条目&#39;这会导致性能不佳,因为它可能是NxN比较(在最差的情况下)情况下)


解决方案2 :使用&#39;名称&#39; (稍微好一点的方式)

public boolean check(List<Person> people, Set<String> names) {
    for(Person person : people) {
        if (names.contains(p.getName()) {
            return true;
        }
    }
}


解决方案3 :使用地图

Map<String, Person> personMap = new HashMap<>();

然后使用

personMap.containsKey("John");

答案 4 :(得分:-1)

如果您使两种类型的对象具有公共基类,并且该基类实现了“可比较”接口,则可以大致这样做。

然后,您可以在每个子类中定义不同的compareTo方法,以获得所需的行为。