我必须制作一些方法来对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("-------------------------------------------");
}
}
答案 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;
}