我有一个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
或者这甚至不可能,因为数组列表包含不同的对象?
答案 0 :(得分:4)
是的,您可以按照建议的方式实施。为了使其更简洁,您还可以使用for-each
构造并切换循环(names
在contains
内循环):
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());
请注意,如果names
为Set<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方法,以获得所需的行为。