java从对象列表中获取子列表

时间:2010-07-12 11:47:19

标签: java list

有一个依赖列表

家属包含

String emp_Id, name etc,

List<Dependent> dependentList;

dependentList包含员工的所有相关信息。

如何通过提供emp_Id获取受抚养人列表?

例如,一名员工将有2或3名家属。

好吧我不想循环它。

我使用比较器在列表上尝试了二进制搜索,但它没有返回所需的数据。

已经我将遍布员工名单...随后我应该得到特定员工的依赖... 什么是最好的&amp;有效的解决方案?

4 个答案:

答案 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.Multimaporg.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.