使用stream和compareTo从ArrayList中对对象进行排序和过滤

时间:2015-01-17 02:22:26

标签: java sorting arraylist java-stream

我必须制作一些方法来对ArrayList中的对象进行排序和过滤,我对此变得疯狂。我在ListaEmpleados类中解释了我必须要做的方法。

public class Empleado implements Comparable<Empleado> {

private String nif;
private String nombre;
private Double sueldo;

public Empleado(String nif, String nombre, Double sueldo) {
    this.nif = nif;
    this.nombre = nombre;
    this.sueldo = sueldo;
}

public String getNif() {
    return nif;
}

public void setNif(String nif) {
    this.nif = nif;
}

public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}

public Double getSueldo() {
    return sueldo;
}

public void setSueldo(Double sueldo) {
    this.sueldo = sueldo;
}

@Override
public String toString() {
    return "Empleado{" + "nif=" + nif + ", nombre=" + nombre + ", sueldo=" +    
sueldo + '}';
}

public int compareTo(Empleado t) {

    return this.nif.compareTo(t.nif);
}

}

这是我必须构建方法的地方,有些是作品,但是其他我无法做到或者不知道如何构建它们。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import javax.accessibility.AccessibleRole;

public class ListaEmpleados implements Comparator<Empleado> {

static List<Empleado> empleados = new ArrayList<>();

// Method to order the list by name. SEEMS it WORKS!

public static void ordenaPorNombre(List<Empleado> lista) {

Collections.sort(lista, (Empleado e1, Empleado e2) ->     
 e1.getNombre().compareTo(e2.getNombre()));
}

// Method to order by ascending salary (sueldo in spanish). SEEMS it WORKS!

public static void ordenaPorSueldo(List<Empleado> lista) {

    Collections.sort(lista, (Empleado e1, Empleado e2) -> 
    e1.getSueldo().compareTo(e2.getSueldo()));

}

// In this one i have to return the employee whith hig salary. DONT WORKS 
//return incorrect employee
// returns {nif=4433345Z, nombre=juan, sueldo=2000.0} and must be 
//{nif=0403993X, nombre=zen, sueldo=4000.0}

public static Empleado retornaEmpleadoMayorSueldo(List<Empleado> lista) {

    Empleado emp = Collections.max(lista);
    return emp;
}

// This one return all employees with salary minus or equals to 
// sueldoMaximo, I have to do it with stream.
// Dont works. ERRORS---    ") expected" --- "and boolean cannot be 
// derefenced"

public List<Empleado> empleadosConSueldo(double sueldoMAximo, List<Empleado>    
lista) {

Empleado employee = (Empleado) lista.stream().filter(e -> 
e.getSueldo().equals(sueldoMAximo).get();
    return (List<Empleado>) employee;
}

// this method return the average salary from the employees that name begins 
//with the firstword passed by argument. 

public double sueldoMedioEmpiezanPor(char firstword) {
    //no idea how i can make it.    
}

@Override
public int compare(Empleado e, Empleado e1) {
    return e.getSueldo().compareTo(e.getSueldo());
}

}

主要用于初始化阵列和员工(西班牙语中的empleado)

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Unidad4P1 {

public static void main(String[] args) {

List<Empleado> empleados = new ArrayList();

    Empleado emp1 = new Empleado("1459383D", "patxi", 1000.0);
    Empleado emp2 = new Empleado("3403993X", "ana", 1500.0);
    Empleado emp4 = new Empleado("0403993X", "zen", 4000.0);
    Empleado emp3 = new Empleado("4433345Z", "juan", 2000.0);

    empleados.add(emp1);
    empleados.add(emp2);
    empleados.add(emp4);
    empleados.add(emp3);

    Collections.sort(empleados);

    System.out.println("Order by NIF:" + empleados);
    System.out.println("-------------------------------------------");

    ListaEmpleados.ordenaPorNombre(empleados);
    System.out.println("order by NAME:" + empleados);
    System.out.println("-------------------------------------------");

    ListaEmpleados.ordenaPorSueldo(empleados);
    System.out.println("Order by salary:" + empleados);
    System.out.println("-------------------------------------------");

    System.out.println("Employee Hig Salary is:" +    
ListaEmpleados.retornaEmpleadoMayorSueldo(empleados));
    System.out.println("-------------------------------------------");

}

}

2 个答案:

答案 0 :(得分:0)

方法“retornaEmpleadoMayorSueldo”不起作用,因为Collections.max使用“Comparable”来确定谁是最大雇员。你的班级Empleado正在返回“this.nif.compareTo(t.nif)”他正在返回“Juan”因为Juan有最大nif(4433345Z)。您必须使用“比较器”,如您的方法“ordenaPorSueldo”。 像这样:

public static Empleado retornaEmpleadoMayorSueldo(List<Empleado> lista) {
    return Collections.max(lista, new Comparator<Empleado >() {
               @Override
               public int compare(Empleado e1, Empleado e2) {
                   return e1.getSueldo().compareTo(e2.getSueldo()));
               }
           });
}

平均工资是:

public double sueldoMedioEmpiezanPor(List<Empleado> employees, char firstword) {
    double salarySum = 0.0;
    int employeeCount = 0;
    for (Empleado employee : employees ) {
        if(firstword == employee.getNombre().charAt(0)){
            salarySum += employee.getSueldo();
            employeeCount++;
        }
    }
    return salarySum / employeeCount; 
}

“empleadosConSueldo”如上所述,你只需比较“sueldo”而不是“nombre”,并将所有“Sueldo”减去或等于“sueldoMAximo”的员工放回另一个列表中。其他方法是从员工列表中删除薪水大于“sueldoMAximo”的所有员工。 如果您有疑问,请亲自尝试并回来。

答案 1 :(得分:0)

最后我用这种方式解决了问题:

public static List<Empleado> empleadosConSueldo(double sueldoMaximo, List<Empleado> lista) {

    List<Empleado> listaResultado;
    listaResultado = lista.stream().filter(e -> e.getSueldo() >= (sueldoMaximo))
                                   .collect(Collectors.toList());
    return listaResultado;
}

public static double sueldoMedioEmpiezanPor(char letra, List<Empleado> lista) {
    Double sueldoMedio = 0.0;
    sueldoMedio = lista.stream().filter(e -> e.getNombre().charAt(0) == letra)
                                .mapToDouble(e -> e.getSueldo()).average().getAsDouble();
    return sueldoMedio;
}