有一个依赖列表
家属包含
String emp_Id, name etc,
List<Dependent> dependentList;
dependentList包含员工的所有相关信息。
如何通过提供emp_Id获取受抚养人列表?
例如,一名员工将有2或3名家属。好吧我不想循环它。
我使用比较器在列表上尝试了二进制搜索,但它没有返回所需的数据。
已经我将遍布员工名单...随后我应该得到特定员工的依赖... 什么是最好的&amp;有效的解决方案?
答案 0 :(得分:2)
仅当列表根据比较器排序时,二进制搜索才有效。对于未根据其他条件排序或排序的列表,您必须对其进行过滤。
如果您想过滤,我建议Google Collections(或Google Guava,这是Google收藏的超集):
Collection<Dependent> filtered = Collections2.filter(dependentList, new Predicate<Dependent>() {
public boolean apply(Dependent from) {
return from != null && from.getId().equals(id_so_search_for);
}
}
当然,您不仅限于.equals()
,而是可以根据所需的任何操作进行匹配(例如通过正则表达式)。
如果搜索一种数据大量超重搜索任何其他类型的数据,那么将它们存储在Map<kind-of-id, Dependent>
中也可能是一个不错的选择。您仍然可以使用Map.values()
检索所有存储对象的集合。
如果一个键映射到多个项目,则使用Map<kind-of-id, Collection<Dependent>>
或(更好)考虑使用现有的 Multimap 功能:com.google.common.collect.Multimap或org.apache.commons.collections.MultiMap(注意Apache Commons没有这个的通用版本。)
答案 1 :(得分:1)
您想要建立关系模型。我想,你有基本的依赖关系:
所以一个非常基本的实现可以这样:
public class Employee {
int emp_id;
// more fields, more methods
}
public class Supervisor extends Employee {
private List<Employee> dependants = new ArrayList<Employee>();
// more fields, more methods
public List<Employee> getDependants() {
return dependants;
}
}
public class StaffDirectory {
private Map<Integer, Employee> staff = new HashMap<Integer, Employee>();
public static List<Employee> getAllDependantsOf(int employeeId) {
Employee employee = staff.get(employeeId);
if (employee instanceof Supervisor) {
return ((Supervisor) employee).getDependants());
} else {
return Collections.emptyList();
}
}
}
答案 2 :(得分:0)
到目前为止你尝试了什么?你有什么写的吗?
以下是一般猜测:
int employeeToFind = 10;//the id to search for
for(Dependant dep : dependentList ) {
if(dep.getEmployeeId() == employeeToFind) {
//do something
}
}
您还可以将受抚养人存储在由EmployeeId键入的Hashtable<Integer employeeId,List<Dependent>>();
中,以便轻松查找。
答案 3 :(得分:0)
正如alzoid所提到的,HashMap或HashTable是此任务的完美数据结构。如果您有机会将Dependent实例加载到此类对象中,请执行此操作。 仍然有这个美味的代码:
String emp_Id //IDs are usually integer, but I'll go with your example
List<Dependent> dependentList; //assume this is populated
List<Dependent> desiredSublist = new ArrayList<Dependent>();
for(Dependent dep:dependentList){
//make sure to compare with equals in case of Id being String or Integer
if(dep.getId().equals(emp_Id)){
desiredSubList.add(dep);
}
}
//desiredSublist now contains all instances of Dependent that belong to emp_Id.