У меня есть список массивов типа String и массив Array List типа Person. Где Person является объектом, который содержит только строку, содержащую имя.
ArrayList<Person> people = new ArrayList<Person>();
ArrayList<String> names = new ArrayList<String>();
Скажем, я делаю это,
names.add("Josh");
people.add(new Person("Josh");
Предполагая, что для создания нового объекта Person будет установлено имя "Josh" и предполагается, что класс Person имеет метод get для имени.
Есть ли способ проверить, содержит ли список массивов имена Человек, который называется Джош.
Единственное, о чем я могу думать,
for(int i = 0; i < names.size(); i++){
if(names.get(i).equals(people.get(i).getName)){
return true;
} // end if
} // end for
Теперь, если список массивов Person и список массивов имен содержат более одного элемента, как проверить, содержит ли строка в списке имен массивов имя одного из Лиц? Использую ли я это?
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
Или это даже не возможно, поскольку в списках массивов содержатся разные объекты?
Да, вы можете реализовать его так, как вы предлагаете. Для того, чтобы сделать его более кратким, вы можете также использовать for-each
конструкта и переключать петлю (names
получают петельные внутри contains
):
for (Person p : people) {
if (names.contains(p.getName()) {
return true;
}
}
В Java 8 вы можете сделать это с помощью Streams.anyMatch()
:
Возвращает true
если есть любое Person
в names
people
, имя которых указано в names
:
people.stream().anyMatch(person -> names.contains(person.getName());
Обратите внимание, что это было бы намного быстрее, если бы names
были Set<String>
вместо List<String>
.
Возможные решения:
Решение 1. Самый простой подход
public boolean check(List<Person> people, List<String> names) {
for(Person person : people) {
if (names.contains(p.getName()) {
return true;
}
}
}
ПРИМЕЧАНИЕ. Это приведет к плохой производительности, если в именах списков есть много записей, так как это может быть сравнение NxN (в худшем случае)
Решение 2. Используйте набор для "имен" (немного лучше)
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");
Вы можете сделать это примерно так, если бы у вас были два типа объектов с общим базовым классом, и этот базовый класс реализовал интерфейс "Comparable".
Затем вы можете определить различные методы compareTo в каждом подклассе, чтобы получить нужное поведение.
Сначала проверьте, что списки имеют одинаковую длину.
Затем проверьте, что каждый элемент в одном содержится в другом. Конечно, это предполагает, что имена уникальны среди списков.
if (people.size () != names.size ()){
return false;
}
for(Person p : people) {
if(!names.contains(p.getName())){
return false;
}
}
return true;
for(Person p : people) if(p.getName().equals("Josh")) return true;
?