我将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");
但是我得到了施法异常
非常感谢任何帮助。
由于
答案 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方法。