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

Sorting and filter objects from an ArrayList using stream and compareTo

我必须制定一些方法来对 ArrayList 中的对象进行排序和过滤,我对此非常着迷。我在 ListaEmpleados class.

中解释了我必须做的方法
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("-------------------------------------------");

}

}

方法 "retornaEmpleadoMayorSueldo" 不起作用,因为 Collections.max 使用 "Comparable" 来确定谁是最大雇员。你的 class Empleado returning "this.nif.compareTo(t.nif)" 他 returning "Juan" 因为 Juan 有最大的 nif(4433345Z)。您必须像您的方法 "ordenaPorSueldo" 一样使用 "Comparator"。 像这样:

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" 的员工放入return 的另一个列表。另一种方法是从员工列表中删除所有薪水大于 "sueldoMAximo" 的员工。 自己试试,有疑问再回来。

最后我这样解决了问题:

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;
}