当前位置: 首页 > 知识库问答 >
问题:

实现具有特定条件的比较器

闻华容
2023-03-14

我需要实现比较器,以便根据特定条件对<code>Employee<code>对象进行排序。

 class Employee
 {
      int employeeId;
      String employeeName;

 }

所以我手里已经有一个排序的List列表,我修改排序顺序如下

  1. 保持排序顺序
  2. 如果employeeName在Employee对象中为“Rock Hudson”,则将其添加到列表顶部

1 艾伦边界

2 贝蒂·爱德华兹

3 哈德逊岩石

4 昆汀·塔伦蒂诺

5伍迪·艾伦

3 哈德逊岩石

1 艾伦边界

2 贝蒂·爱德华兹

4 昆汀·塔伦蒂诺

5伍迪·艾伦

共有3个答案

翁俊良
2023-03-14

对于这种情况,只需制定一个特殊条件,在每个方向进行测试:

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());
    }
}
邵伟泽
2023-03-14
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"));
越鸿才
2023-03-14

你可以这样做

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

哪个输出

[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]
 类似资料:
  • 我在理解和使用比较器方面有一个问题,有人问我以下问题: 我在一个单独的Employee类中使用compareTo比较器接口来调用比较器对象的重载使用。 任何帮助,建议,代码行将非常感谢!!

  • 问题内容: 我们有一些代码根据其坐标之间的距离对地址列表进行排序。这是通过使用自定义比较器的collections.sort完成的。 但是,列表中有时不包含地址,这会导致NullPointerException。解决这个问题的最初想法是让比较器返回至少0个坐标为零的地址的距离。我担心这可能导致列表中“有效”元素的顺序损坏。 因此是否可以在比较器中为空数据返回“ 0”值,还是有一种更干净的方法来解决

  • 我正在尝试编写一个使用最小优先级队列的算法,所以我在谷歌上四处查看并找到了PriorityQueue。不过,似乎为了使用它,我需要告诉它我希望它如何排列优先级,并且这样做的方法是使用比较器(我想比较我的“Node1”对象的特定数据字段)。更多的谷歌搜索提出了创建一个新的比较器的想法,它实现了比较器但覆盖了比较方法。我正在尝试的是这样(以及它的其他变体): 编译器有几个理由提出抗议,其中之一是我没有

  • 我试着选一个段落,通过打印出前三个单词来找到它的“意义”。去掉所有语法单词和空白后,我使用Hashmap计算每个单词的出现次数。然后,由于我不知道更好的方法,我只是创建了自己的小自定义对象来存储单词、键和出现次数、值,就像Hashmap一样,但我的老师建议实现Comparable,但我遇到了一个问题。我有两个问题,一个在我“修复”另一个时出现。问题在于Pair类中的compareTo函数和另一个类

  • 嗨,我是贾维斯的新手。 我有一个实体,我正在为它实现一个自定义比较器,以便使用Javers进行比较。 我的实体:- 包装com.devyansh.entity; 进口java.util.清单; 导入组织。贾维斯。果心元模型。注释。实体 下面我注册了新的比较器:- 我的比较器实现:- 问题领域:- 每当我尝试使用以下行进行比较时:- Diff Diff=标枪。比较(new Ent(“aaa”,new

  • 问题:我试图检查我是否可以使用2个或更多标准对列表(数据类型对象的ArrayList)进行排序。请注意,我知道使用比较器和比较功能。我希望检查是否有方法使用2个或更多标准进行排序,而不必使用我可以轻松使用比较器功能的自定义数据类型。对于1个标准排序,以下代码有效。 在这种情况下,如果我执行以下操作,IntelliJ IDE会立即给出一个错误,表示o.get(3)的“无法解析方法”get(int)”