Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用特定条件实现比较器_Java_Sorting_Comparator - Fatal编程技术网

Java 使用特定条件实现比较器

Java 使用特定条件实现比较器,java,sorting,comparator,Java,Sorting,Comparator,我需要实现Comparator,以便根据特定条件对Employee对象进行排序 class Employee { int employeeId; String employeeName; } 因此,我手中已经有一个列表的排序列表,我修改排序顺序如下 维持分拣顺序 如果employeeName在Employee对象中为“Rock Hudson”,请将其添加到列表顶部 >输入: 1艾伦·博德 2贝蒂·爱德华兹 3罗克哈德逊 4昆廷塔伦蒂诺 伍迪·艾伦 >输出: 3罗

我需要实现Comparator,以便根据特定条件对
Employee
对象进行排序

 class Employee
 {
      int employeeId;
      String employeeName;

 }
因此,我手中已经有一个列表的排序列表,我修改排序顺序如下

  • 维持分拣顺序
  • 如果employeeName在Employee对象中为“Rock Hudson”,请将其添加到列表顶部
  • >输入:

    1艾伦·博德

    2贝蒂·爱德华兹

    3罗克哈德逊

    4昆廷塔伦蒂诺

    伍迪·艾伦

    >输出

    3罗克哈德逊

    1艾伦·博德

    2贝蒂·爱德华兹

    4昆廷塔伦蒂诺

    伍迪·艾伦


    在这种情况下,只需在每个方向上测试一个特殊条件:

    Comparator<Employee> c = new Comparator<Employee>() {
        public int compare(Employee a, Employer b) {
            if (a.getName().equals("Rock Hudson"))
                 return -1;
            if (b.getName().equals("Rock Hudson"))
                 return 1;
            return a.getName().compareTo(b.getName());
        }
    }
    
    比较器c=新比较器(){ 公共整数比较(员工a、雇主b){ 如果(a.getName().equals(“Rock Hudson”)) 返回-1; 如果(b.getName().equals(“Rock Hudson”)) 返回1; 返回a.getName().compareTo(b.getName()); } }
    你可以这样做

    public static class Employee {
      // a constructor
      public Employee(int id, String name) {
        this.employeeId = id;
        this.employeeName = name;
      }
    
      // should be private and use getters and setters.
      int employeeId;
      String employeeName;
    
      // A special Comparator
      public static Comparator<Employee> rockHudsonComparator = new Comparator<Employee>() {
        @Override
        public int compare(Employee a, Employee b) {
          if (a.employeeName.equals("Rock Hudson")) {
            if (b.employeeName.equals("Rock Hudson")) {
              return 0;
            }
            return -1;
          } else if (b.employeeName.equals("Rock Hudson")) {
            return 1;
          }
          return a.employeeName
              .compareTo(b.employeeName);
        }
      };
    
      public String toString() {
        return "" + employeeId + " " + employeeName;
      }
    }
    
    public static void main(String[] args) {
      java.util.List<Employee> al = new java.util.ArrayList<Employee>();
      al.add(new Employee(1, "Alan Border"));
      al.add(new Employee(2, "Betty Edwards"));
      al.add(new Employee(3, "Rock Hudson"));
      al.add(new Employee(4, "Quentin Tarantino"));
      al.add(new Employee(5, "Woody Allen"));
      al.add(new Employee(6, "Rock Hudson")); // check the sort is stable.
      System.out.println("Before sort");
      System.out.println(al);
      java.util.Collections.sort(al,
          Employee.rockHudsonComparator);
      System.out.println("After sort");
      System.out.println(al);
    }
    

    那么,是什么阻止您实现您描述的
    比较器
    ?你遇到问题了吗?是的。为什么不实现自己的比较器呢?谢谢,这很有效。我对这件事不熟悉。。如果我有一个以上的首选元素呢……例如,如果我想把Rock Hudson和Woody Allen都移到顶部呢?你不应该让它们相等。。。因为如果每个都有3个,那么它将显示为随机的(例如)。但是你可以添加一个
    |
    ,然后自己用
    来看看如果(a.employeeName.equals(“Rock Hudson”)| a.employeeName.equals(“Woody Allen”)){
    你读过我说的吗?没有一个员工同时有两个名字,所以它不能是
    。不要使用
    |
    。更灵活一些。给
    比较器
    一个类型为
    的字段设置
    并使用
    包含的
    。不要忘记确定“特殊”的顺序有人出现。@DavidWallace我没有。我开车时在iphone上输入了它。错误在哪里(我觉得没问题)?顺便说一句,我有意识地认为存在两个岩石哈德逊的边缘案例无关紧要。看起来你已经发现了主要错误并修复了它。还有一个小问题,就是不遵守比较器的总合同(参见我对其他人答案的评论);但至少这会起作用。顺便说一下,我的家人(但不是我)目前正在墨尔本度假。你认为你可以在开车时不要回答这样的问题,至少在他们回来之前不要回答这样的问题吗?:-)@ElliottFrisch不再回答了……哈哈哈。但肯定是打错了。@DavidWallace没有撞车的危险:我在高峰时间在“高速公路”上:)
    
    [1 Alan Border, 2 Betty Edwards, 3 Rock Hudson, 4 Quentin Tarantino, 5 Woody Allen, 6 Rock Hudson]
    [3 Rock Hudson, 6 Rock Hudson, 1 Alan Border, 2 Betty Edwards, 4 Quentin Tarantino, 5 Woody Allen]
    
    public class MyEmployeeComparator implements Comparator<Employee> {
    
        private final String alwaysTopEmployee;
    
        public MyEmployeeComparator(final String alwaysTopEmployee) {
            this.alwaysTopEmployee = alwaysTopEmployee;
        }
    
        @Override
        public int compare(Employee o1, Employee o2) {
            if (o2.getName().equals(alwaysTopEmployee) && o1.getName().equals(alwaysTopEmployee))
                return 0;
            if (o1.getName().equals(alwaysTopEmployee))
                return -1;
            if (o2.getName().equals(alwaysTopEmployee))
                return 1;
    
            return o1.getName().compareTo(o2.getName());
        }
    }
    
    Collections.sort(stuff, new MyEmployeeComparator("Rock Hudson"));