Java 使用comparable对字符串属性进行排序
我有一个employee类和一个client类。我可以通过员工id和年龄使用compareTo()进行排序,因为它们是整数类型。但我该如何按员工姓名或工资排序? compareTo不接受int以外的任何数据类型,引发编译时异常Java 使用comparable对字符串属性进行排序,java,collections,comparable,Java,Collections,Comparable,我有一个employee类和一个client类。我可以通过员工id和年龄使用compareTo()进行排序,因为它们是整数类型。但我该如何按员工姓名或工资排序? compareTo不接受int以外的任何数据类型,引发编译时异常 public class Employee implements Comparable<Employee> { private int id; private String name; private int age; pri
public class Employee implements Comparable<Employee> {
private int id;
private String name;
private int age;
private long salary;
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public long getSalary() {
return salary;
}
public Employee(int id, String name, int age, int salary) {
this.id = id;
this.name = name;
this.age = age;
this.salary = salary;
}
@Override
public int compareTo(Employee emp) {
//let's sort the employee based on id in ascending order
//returns a negative integer, zero, or a positive integer as this employee id
//is less than, equal to, or greater than the specified object.
return (this.age - emp.age);
}
@Override
//this is required to print the user friendly information about the Employee
public String toString() {
return "[id=" + this.id + ", name=" + this.name + ", age=" + this.age + ", salary=" +
this.salary + "]";
}
}
我只是在谷歌上搜索了一下,似乎我也可以通过实现comparator来实现它
public static Comparator<Employee> SalaryComparator = new Comparator<Employee>() {
@Override
public int compare(Employee e1, Employee e2) {
return (int) (e1.getSalary() - e2.getSalary());
}
};
我将通过以下方式实现compareTo:
public int compareTo(Employee emp) {
return Integer.compare(this.age, emp.age);
}
我将通过以下方式实现compareTo:
public int compareTo(Employee emp) {
return Integer.compare(this.age, emp.age);
}
如果要根据名称进行排序,可以尝试
@Override
public int compareTo(Employee emp) {
return this.name.compareTO(emp.name);
}
如果要根据名称进行排序,可以尝试
@Override
public int compareTo(Employee emp) {
return this.name.compareTO(emp.name);
}
基本上,您希望根据几个属性对类进行排序。这里的诀窍是决定评估它们的顺序,并将一个单独视为
可比的
。如果比较不是0
-您找到了哪个实例应该在另一个实例之前,您可以只返回值。如果没有,则需要评估其他属性
例如,假设您要使用的属性是id
、age
、name
和salary
:
@Override
public int compareTo(Employee emp) {
// compare IDs:
int cmp = Integer.compare(id, emp.id);
if (cmp != 0) {
return cmp;
}
// compare ages:
cmp = Integer.compare(age, emp.age);
if (cmp != 0) {
return cmp;
}
// compare names. Luckily, Strings are comparable:
cmp = name.compareTo(emp.name);
if (cmp != 0) {
return cmp;
}
// compare salaries, using the builtin Long.compare:
return Long.compare (salary, emp.salary);
}
基本上,您希望根据几个属性对类进行排序。这里的诀窍是决定评估它们的顺序,并将一个单独视为
可比的
。如果比较不是0
-您找到了哪个实例应该在另一个实例之前,您可以只返回值。如果没有,则需要评估其他属性
例如,假设您要使用的属性是id
、age
、name
和salary
:
@Override
public int compareTo(Employee emp) {
// compare IDs:
int cmp = Integer.compare(id, emp.id);
if (cmp != 0) {
return cmp;
}
// compare ages:
cmp = Integer.compare(age, emp.age);
if (cmp != 0) {
return cmp;
}
// compare names. Luckily, Strings are comparable:
cmp = name.compareTo(emp.name);
if (cmp != 0) {
return cmp;
}
// compare salaries, using the builtin Long.compare:
return Long.compare (salary, emp.salary);
}
compareTo
希望您根据Comparable
的文档返回一个描述三元比较结果的整数(小于、等于或大于),别混淆了。我知道我想知道如何通过名称进行比较?因为您的名称是字符串
,字符串
也实现了可比性
,只需重复使用它:返回这个.name.compareTo(emp.name)代码>使用索引按名称获取字段并在比较器模型中使用。compareTo
希望您根据Comparable
的文档返回描述三元比较结果的整数(小于、等于或大于),别混淆了。我知道我想知道如何通过名称进行比较?因为您的名称是字符串
,字符串
也实现了可比性
,只需重复使用它:返回这个.name.compareTo(emp.name)代码>使用索引按名称获取字段,并在比较器模型中使用它。如果使用的是诸如int
之类的基本类型,则此操作将不起作用。Age被声明为int
。如果您使用的是int
之类的基元类型,这将不起作用。年龄被声明为int
。