Как получить объект из ArrayList без цикла? - PullRequest
0 голосов
/ 24 ноября 2018

Предположим, у меня есть класс Employee:

class Employee {
         Employee(String name, int age)
         {
             this.name = name ;
             this.age = age;
         }
         String name ;
         int age;
     }

. Теперь создайте список, подобный этому:

ArrayList<Employee> aa = new ArrayList<Employee>();
 aa.add(new Employee("Nitish", 26));
 aa.add(new Employee("Sh", 2));
 aa.add(new Employee("S", 1));

Могу ли я получить объект Employee, где значение имени равно "Nitish"?Без петли For

Ответы [ 4 ]

0 голосов
/ 24 ноября 2018

ArrayList работает на основе структуры, основанной на индексах. Для ADD, READ, GET значение из массива необходимо индексировать для конкретного индекса.вместо хранения данных в ArrayList вы можете использовать Map.Используя ключ можно получить доступ к значению из карты.

 Map<String, Employee> employeeMap = new HashMap<>();

    employeeMap.put("Nitish", new Employee("Nitish", 26));
    employeeMap.put("Sh", new Employee("Sh", 2));
    employeeMap.put("S", new Employee("S", 1));

    System.out.println(employeeMap.get("Nitish").getName());
    System.out.println(employeeMap.get("Nitish").getAge());
0 голосов
/ 24 ноября 2018

Полагаю, ваш интервьюер просто не хочет, чтобы вы использовали циклы for или while для поиска объектов в ArrayList, но вы можете найти их "без циклов".

Сначала, вам нужно переопределить equals и hashCode из Employee класса:

@Override public boolean equals(Object obj) {
    // ...
}

@Override public int hashCode() {
    // ...
}

Теперь вы можете найти свой объект с помощью ArrayList.indexOf (использует equals для поискасоответствует), создав фиктивную ссылку:

Employee target = new Employee("Nitish", 26);
int index = employees.indexOf(target);

Это довольно глупо, но я думаю, что некоторые интервьюеры хотят, чтобы мы думали нестандартно.Несмотря на то, что под капотом он использует циклы, но если мой интервьюер задает мне тот же вопрос, вместо того, чтобы сказать «нет, вы не можете», я бы использовал этот пример, потому что я хочу стараться изо всех сил, только чтобы не использовать «циклы», как было сказанои объясняет, как это работает за кулисами.Затем я бы ненадолго придумал другие лучшие решения и надеюсь, что это сработает!

0 голосов
/ 24 ноября 2018

Попробуйте это

Employee emp = aa.stream().filter(e->e.name.equals("Nitish")).findAny().orElse(null);

эта версия возвращает ноль, если не найдена

0 голосов
/ 24 ноября 2018

Вы можете использовать отфильтрованный поток:

Object[] array = aa
        .stream()
        .parallel()
        .filter((emp) -> emp.name.equals("Nitish"))
        .toArray();

if (array.length > 0) {
    Employee employee = (Employee)array[0];
    String name = employee.name;
    int age = employee.age;
    System.out.println("Found Employee with Name = " + name + " and Age = " + age);
} else {
    System.out.println("Not Found");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...