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