【问题标题】:Sorting the list having multiple fields in one comparator对一个比较器中具有多个字段的列表进行排序
【发布时间】:2018-08-09 11:50:57
【问题描述】:

我在一次采访中被要求使用 java 中的单个比较器对具有nameagesalary 的员工进行排序。前提是:

  1. 应该有一个比较器
  2. 不应有任何条件块

假设如果用户点击用户界面中的名称和升序链接。列表应该按照姓名升序排列,如果用户在UI中点击工资和降序链接,列表应该按照工资降序排列。

单个比较器应该根据用户输入处理所有方法,它应该对列表进行排序。

任何帮助将不胜感激

【问题讨论】:

  • 好的,您尝试了什么,遇到了什么问题?
  • switch 语句是有条件的吗?
  • 恕我直言,使用单个比较器执行此操作将是糟糕的设计。只需对不同种类使用多个比较器。一个比较器然后“不比较”更糟糕,并且可能会导致一个非常“聪明”(即 hacky、过于复杂)的解决方案。
  • 请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作摘要,以及对您在解决它时遇到的困难(help centerHow to Ask)。
  • 或者他们正在寻找 Golfcode 冠军材料或其他东西 - 不合格,我的代码太冗长;(

标签: java list comparator


【解决方案1】:

基本上他在问:- 如何在 Comparator java 8 中使用 lambda 表达式。

这里是完整的例子:-

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

public class EmpCompare2 {

    public static void main(String[] args) {

        List<Employee> companyTeam = new ArrayList<>();
        Employee empComparator1 = new Employee("Vipul", 25, 20000);
        Employee empComparator2 = new Employee("Amol", 21, 30000);
        Employee empComparator3 = new Employee("Sandeep", 22, 40000);
        Employee empComparator4 = new Employee("Sagar", 23, 60000);
        Employee empComparator5 = new Employee("kamal", 24, 6000);
        Employee empComparator6 = new Employee("Zandu", 20, 5000);
        companyTeam.add(empComparator1);
        companyTeam.add(empComparator2);
        companyTeam.add(empComparator3);
        companyTeam.add(empComparator4);
        companyTeam.add(empComparator5);
        companyTeam.add(empComparator6);

        // sort by age
        Collections.sort(companyTeam, new Comparator<Employee>() {
            @Override
            public int compare(Employee o1, Employee o2) {
                return o1.getAge() - o2.getAge();
            }
        });

        // lambda
        companyTeam.sort((Employee o1, Employee o2) -> o1.getAge() - (o2.getAge()));

        // lambda
        companyTeam.sort((o1, o2) -> o1.getAge() - (o2.getAge()));
        System.out.println("After Sorting BY Age: companyTeam " + companyTeam);

        // sort by salary
        Collections.sort(companyTeam, new Comparator<Employee>() {
            @Override
            public int compare(Employee o1, Employee o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });

        // lambda
        companyTeam.sort((Employee o1, Employee o2) -> o1.getName().compareTo(o2.getName()));

        // lambda
        companyTeam.sort((o1, o2) -> o1.getName().compareTo(o2.getName()));
        System.out.println("After Sorting : companyTeam " + companyTeam);
    }

}

或者您可以在下面的 java 8 环境中使用下面的代码。

我们可以有3个布尔ageFlag = false;,布尔nameFlag = true;,布尔salaryFlag = false;,就像下面的标志值我们可以从UL点击

import java.util.Comparator;

public class EmpDataCompare implements Comparator<Employee> {

    boolean ageFlag = false;
    boolean nameFlag = true;
    boolean salaryFlag = false;



    public int compare(Employee emp1, Employee emp2) {
        if (ageFlag) {
            return (emp1.getAge() - emp2.getAge());
        }
        if (nameFlag) {
            int nameComp = emp1.getName().compareTo(emp2.getName());
            return ((nameComp == 0) ? emp1.getName().compareTo(emp2.getName()) : nameComp);
        }
        if (salaryFlag) {
            return (emp1.getSalary() - emp2.getSalary());
        }

        return (emp1.getAge() - emp2.getAge());// return by default compare value by age

    }

}

但我想建议我们应该有单独的 Comparator 类实现,以使用 Employee 的姓名、年龄、薪水属性根据 Java 中的关注点分离规则对员工进行排序 [https://en.wikipedia.org/wiki/Separation_of_concerns] 或使用 Java 8 样式代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多