在List中寻找价值

时间:2013-02-18 12:19:51

标签: java list collections

我将List声明为

        private List<Employees> employees;

我正在使用DAO从数据库获取值

        employees= new ArrayList<Employees>();
        employees.addAll(myDAO.getEmployees());

我想在employees List中搜索一个值,在employees List中查找值的最佳方法是什么?

我试过了

    Collections.sort(employees);
    int index = Collections.binarySearch(employees, "abc");

但是我得到了施法异常

非常感谢任何帮助。

由于

6 个答案:

答案 0 :(得分:6)

Collections.sort(employees); // BigO - nlog(n)
int index = Collections.binarySearch(employees, new Employee("abc",...)); // BigO - log(n)

如果您每次对列表进行排序并进行搜索,则代码复杂度为nlog(n) + log(n),其中nlog(n)用于排序列表,log(n)用于二进制搜索。

最好是线性搜索列表。班轮搜索需要BigO - n,其性能优于以前的方法。


您在cast Exception方法中获得了Collections#sort,因为您的列表包含null value,无法投放员工并提升ClassCastException

答案 1 :(得分:1)

Employees lookingForValue(String value, List<Employees> employees)
{
    for (Employees employee : employees)
    {
       if (value.equals(employee.getFieldValue()))
       {
          return employee;
       }
    }
    return null;
}  

用法

lookingForValue("abc", employees);

答案 2 :(得分:1)

如果你不能使用

myDAO.getEmployees(parameter);

并在您的DAO 中添加where子句 那么你可以做一个for并搜索一个对象

Employee emp = null;

    for(Employee e : employees) {
       if(e.getName().equals("X"))
           emp = e;
    }

    if(emp != null) {
      //handle the found employee
    }
    else {
      //employee not in list
    }

当然你也可以覆盖它的equals方法,用该列实现一个对象并使用(我不推荐它)

myDAO.getEmployees().get(object);

答案 3 :(得分:1)

迭代列表并执行搜索操作:

String searchString = "abc";
for(Employee employee: employees) {
  if(employee.getName().equals(searchString)) {
    // Found something!
  }
}

如果要搜索Employee的所有字段,可能需要在Employee中创建一个检查实例上所有字段的方法:

boolean findString(String searchString) {
  if(getName().equals(searchString)) return true;
  if(getCity().equals(searchString)) return true;
  // etc..
  return false;
}

并在for循环中使用此方法。

答案 4 :(得分:1)

如果您的列表非常大,我建议您在DAO中进行搜索 - 可以调整dbs以获得此类搜索的最佳性能(例如select * from employees where name = 'abc')然后使用DAO方法仅返回匹配的项目

另一个不错的选择是apache-commons Predicate

例如

matches = CollectionUtils.filter(employees, new Predicate<Employee>()
{
  @Override
  public boolean evaluate(Employee object)

    return "abc".equals(object.getName());
  }
});

显然,参数化出“abc”。如果要重用它,请将Predicate设为命名类。

如果您有许多不同的方式来过滤集合,则谓词实现特别有用;加上它等于免费进行真正的等式检查。

答案 5 :(得分:1)

你走在正确的轨道上。简单地覆盖员工中的equals方法(不应该是员工吗?它描述的是员工集合还是只有一个?)

您的代码应该可以运行。您也可以按上述方式对员工进行排序并提供比较器:

Collections.sort(fields, new Comparator<Employee>() {
    @Override
    public int compare(Employee o1,Employee o2) {
        // TODO Rerturn 0 if equal or either 1 or -1 depending which of o1 or o2 is the bigger
    }
})

在后一种方法中,您不需要覆盖equals方法。