3

我已将 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");

但是我得到了演员异常

非常感谢任何帮助。

谢谢

4

6 回答 6

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无法投 Employee 和 raiseClassCastException

于 2013-02-18T12:25:09.860 回答
1
Employees lookingForValue(String value, List<Employees> employees)
{
    for (Employees employee : employees)
    {
       if (value.equals(employee.getFieldValue()))
       {
          return employee;
       }
    }
    return null;
}  

用法

lookingForValue("abc", employees);
于 2013-02-18T12:25:21.097 回答
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);
于 2013-02-18T12:25:38.920 回答
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并在您的-loop中使用此方法。

于 2013-02-18T12:26:19.407 回答
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,请将其设为命名类。

如果您有许多不同的方式要过滤集合,谓词实现特别有用;加上它为真正的平等检查留下了自由。

于 2013-02-18T12:26:34.683 回答
1

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

然后您的代码应该可以工作。您还可以如上所述对您的员工进行排序并提供一个比较器:

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 方法。

于 2013-02-18T12:27:21.730 回答