2011-08-18 91 views
0

我有一個類如下。尋找Java中ArrayList中的每個組的最小值

public class Employee{ 
int EmployeeDepartmentId; 
int EmplyoyeeId; 
int Salary; 
} 

我創建一個ArrayList如下。

ArrayList<Employee> arrEmployee = new ArrayList<Employee>; 

現在,我想從與最低工資各部門找出員工的名單。

這是如何實現的。我嘗試使用Collections.Min(),但那會給我整個列表中的最低工資。我希望它按部門分組。

有什麼建議嗎?

+0

使用每個部門的單獨列表。 – m0skit0

+0

我可以得到某種方式的子列表與所有的員工屬於一個部門?我的意思是它應該遍歷主列表,創建第一部門的子列表,找到最小值並保存在另一個數組列表中,然後檢查下一個部門。可以這樣做嗎? –

+0

我沒有看到沒有解析整個列表 – m0skit0

回答

4

做兩次運行。第一個組員工按部門,也許是使用地圖:

Map<Integer,List<Employee>> 

然後在這個地圖搶奪最小每個列表的循環。

+0

感謝Jim和m0skit0 ..我得到了它的工作。非常感謝。 –

+0

@Tushar Vengurlekar沒問題:) – Jim

+0

沒問題,不客氣 – m0skit0

1

使用由吉姆的想法,這樣的事情應該工作:

Map<Integer, List<Employee>> hmap = new HashMap<Integer, List<Employee>>(); 
int i = 0; 
int size = arrEmployee.size(); 
for(i = 0; i < size; i++) 
{ 
    Employee emp = arrEmployee.get(i); 
    List<Employee> list = hmap.get(emp.EmployeeDepartmentId); 
    if (list == null) 
    { 
     list = new ArrayList<Employee>();  
    } 
    list.add(emp); 
    hmap.put(emp.EmployeeDepartmentId, list); 
} 
1

你應該讓自己的比較:

Collections.min(list,new Comparator<Employee>() { 
       public int compare(Employee e1, Employee e2) { 
         return e2.getSalary().compareTo(e1.getSalary()); 
        } 
       }); 

我希望這有助於。

這隻會得到最低工資。

+0

恐怕你沒有正確理解這個問題。他希望爲每個不同的EmployeeDepartmentId區分最小值。 – m0skit0

0

每個邏輯是比較他們將通過部門工資中分組和排序的:

public class Employee { 
Integer EmployeeDepartmentId; 
Integer EmplyoyeeId; 
Integer Salary; 

public Employee(Integer employeeDepartmentId, Integer emplyoyeeId, Integer salary) { 
    EmployeeDepartmentId = employeeDepartmentId; 
    EmplyoyeeId = emplyoyeeId; 
    Salary = salary; 
} 

public Integer getEmployeeDepartmentId() { 
    return EmployeeDepartmentId; 
} 

public void setEmployeeDepartmentId(Integer employeeDepartmentId) { 
    EmployeeDepartmentId = employeeDepartmentId; 
} 

public Integer getEmplyoyeeId() { 
    return EmplyoyeeId; 
} 

public void setEmplyoyeeId(Integer emplyoyeeId) { 
    EmplyoyeeId = emplyoyeeId; 
} 

public Integer getSalary() { 
    return Salary; 
} 

public void setSalary(Integer salary) { 
    Salary = salary; 
} 

public static void main(String[] args) { 
    List<Employee> employees=new ArrayList<Employee>(); 
    employees.add(new Employee(3, 3, 50)); 
    employees.add(new Employee(2, 4, 2500)); 
    employees.add(new Employee(1, 1, 100)); 
    employees.add(new Employee(2, 5, 1100)); 
    employees.add(new Employee(1, 2, 20)); 
    for(Employee e:employees) 
     System.out.println(e.getEmployeeDepartmentId()+" "+e.getEmplyoyeeId()+" "+e.getSalary()); 
    Collections.sort(employees,new Comparator<Employee>() { 
     @Override 
     public int compare(Employee e, Employee e1) { 
      if(e.getEmployeeDepartmentId()==e1.getEmployeeDepartmentId()){ 
       return e.getSalary().compareTo(e1.getSalary()); 
      }else 
       return e.getEmployeeDepartmentId().compareTo(e1.getEmployeeDepartmentId()); 
     } 
    }); 
    for(Employee e:employees) 
     System.out.println(e.getEmployeeDepartmentId()+" "+e.getEmplyoyeeId()+" "+e.getSalary()); 
} 

}

+1

這不是一回合。除此之外,排序將採用'n(log n)',從而使得總體複雜度爲'n + n(log n)'。放入地圖,然後迭代地圖是'2n',這是保證更快。 – Qwerky

+0

其實你是對的,我的錯誤,我會改變它。 – Zemzela

0

你必須這樣做youself:

Map<Integer, Employee> minSalary = new HashMap<Integer, Employee>(); 
for(Employee emp : employeeList) { 
    Integer depId = emp.getDepartmentId(); 
    if(minSalary.containsKey(depId)) { 
     if(emp.getSalary() < minSalary.get(depId).getSalary()) { 
      minSalary.put(depId, emp); 
     } 
    } 
    else { 
     minSalary.put(depId, emp); 
    } 
} 

注意只有一個Employee以最低工資存儲,但僅當您只想知道工資時就足夠了。如果你真的需要所有員工的最低工資,你需要一個Map<Integer, List<Employee>>。 在這種情況下,我建議以冗餘存儲EmployeesList<Employee>`Map<Integer, List<Employee>>(每DepartmentID的,由其他答案的建議。