【问题标题】:How to get Object from ArrayList Without loop?如何在没有循环的情况下从 ArrayList 获取对象?
【发布时间】:2018-11-24 08:55:30
【问题描述】:

假设我有一个 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));

我可以获取名称值为“Nitish”的员工对象吗?没有 For 循环

【问题讨论】:

  • 不,你不能没有循环。如果你想要即时访问,你可以使用 Map 和 store name 作为 key,Employee 作为 value。
  • 这是面试题
  • 一般来说,面试官会想看看你在回答时的速度和自信程度,如果你尝试提出替代解决方案,他会喜欢的。因此,计划的答案是否定的,并且您可以建议使用 Map 以防万一需要查找而无需循环。
  • 使用地图进行 o(1) 次查找
  • 或者您可以使用流或方法为您执行循环,但不会改变其行为方式。

标签: java android oop


【解决方案1】:

我猜你的面试官只是不想让你使用forwhile 循环在ArrayList 中查找对象,但实际上你可以“不使用循环”找到它们。

首先,您需要覆盖Employee 类的equalshashCode

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

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

现在您可以通过创建一个虚拟引用来使用ArrayList.indexOf(使用equals 查找匹配项)找到您的对象:

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

这有点傻,但我猜有些面试官希望我们跳出框框思考。即使在引擎盖下它使用循环,但如果我的面试官问我同样的问题,而不是说不,你不能,我会使用这个例子,因为我想尽我所能,只是不按要求使用“循环” ,并解释它是如何在幕后工作的。然后我会简要地提出其他更好的解决方案,并希望能奏效!

【讨论】:

  • 这在幕后使用了一个循环。
  • @PeterLawrey 是的,我知道,但是如果我的面试官问我同样的问题,而不是说不,你不能,我会使用这个答案,因为我尽量不使用“循环”如所问,并解释了它是如何在引擎盖下工作的。然后我会简要地提出其他更好的解决方案。
【解决方案2】:

您可以使用过滤流:

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");
}

【讨论】:

  • 这在幕后使用了多个循环
  • 幕后是关键词。
【解决方案3】:

试试这个

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

如果没有找到这个版本返回 null

【讨论】:

    【解决方案4】:

    ArrayList 在基于索引的结构上工作。从数组中添加、读取、获取值需要特定索引的索引。 而是将数据存储在 ArrayList 上,您可以使用 Map。 使用键可以从 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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-08
      • 2011-11-16
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 2017-01-25
      相关资源
      最近更新 更多