Проверьте, равны ли два разных ArrayList

1

У меня есть список массивов типа 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

Или это даже не возможно, поскольку в списках массивов содержатся разные объекты?

  • 0
    for(Person p : people) if(p.getName().equals("Josh")) return true; ?
Теги:
object
arrays
arraylist

5 ответов

4
Лучший ответ

Да, вы можете реализовать его так, как вы предлагаете. Для того, чтобы сделать его более кратким, вы можете также использовать for-each конструкта и переключать петлю (names получают петельные внутри contains):

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

В Java 8 вы можете сделать это с помощью Streams.anyMatch():

Возвращает true если есть любое Person в names people, имя которых указано в names:

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

Обратите внимание, что это было бы намного быстрее, если бы names были Set<String> вместо List<String>.

0

Возможные решения:

Решение 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");
0

Вы можете сделать это примерно так, если бы у вас были два типа объектов с общим базовым классом, и этот базовый класс реализовал интерфейс "Comparable".

Затем вы можете определить различные методы compareTo в каждом подклассе, чтобы получить нужное поведение.

0

Сначала проверьте, что списки имеют одинаковую длину.
Затем проверьте, что каждый элемент в одном содержится в другом. Конечно, это предполагает, что имена уникальны среди списков.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню