Java列表应始终具有特定值作为第一项
我有一个像下面这样的pojoJava列表应始终具有特定值作为第一项,java,collections,Java,Collections,我有一个像下面这样的pojo class Employee { private String employeeName; private String age; //getter();setter(); .... } 我有employeeList,它的值低于 List<Employee> employeeList = new ArrayList<Employee>(); List employeeList=new ArrayList(
class Employee
{
private String employeeName;
private String age;
//getter();setter();
....
}
我有employeeList
,它的值低于
List<Employee> employeeList = new ArrayList<Employee>();
List employeeList=new ArrayList();
值:[{“ccc”,20},{“bbb”,30},{“aaa”,40}]
我希望
employeeList
具有上述值,但该列表应始终首先包含“bbb”对象。如何实现这一点。我们不能简单地对员工姓名进行排序。您可以对集合进行排序。排序
并提供一个比较器
,例如
public void sortList(String byString){
Collections.sort(employeeList, new Comparator<Employee>() {
@Override
public int compare(Employee lhs, Employee rhs) {
if (lhs.getEmployeeName().equals(byString)) return -1;
if (rhs.getEmployeeName().equals(byString)) return 0;
return 1;
}
});
}
public void排序列表(按字符串排序){
Collections.sort(employeeList,newcomparator(){
@凌驾
公共整数比较(员工lhs、员工rhs){
if(lhs.getEmployeeName().equals(byString))返回-1;
if(rhs.getEmployeeName().equals(byString))返回0;
返回1;
}
});
}
Ideone:您可以使用
集合进行排序。排序并提供比较器例如
public void sortList(String byString){
Collections.sort(employeeList, new Comparator<Employee>() {
@Override
public int compare(Employee lhs, Employee rhs) {
if (lhs.getEmployeeName().equals(byString)) return -1;
if (rhs.getEmployeeName().equals(byString)) return 0;
return 1;
}
});
}
public void排序列表(按字符串排序){
Collections.sort(employeeList,newcomparator(){
@凌驾
公共整数比较(员工lhs、员工rhs){
if(lhs.getEmployeeName().equals(byString))返回-1;
if(rhs.getEmployeeName().equals(byString))返回0;
返回1;
}
});
}
Ideone:如果您想使其变为变量并能够传递开始时应排序的内容,您可以创建一个简单的方法:
public static void sort(List<Employee> list, String nameToSortAtBeginning) {
Collections.sort(list, new Comparator<Employee>() {
@Override
public int compare(Employee o1, Employee o2) {
if(nameToSortAtBeginning.equals(o1.getEmployeeName()) && !nameToSortAtBeginning.equals(o2.getEmployeeName())) {
return -1;
} else {
return o1.getEmployeeName().compareTo(o2.getEmployeeName());
}
}
});
}
注意:如果某些员工姓名的值可能为空,则上述代码将不起作用。如果将null作为一个值,则可能还必须在比较器中添加null处理。如果希望使其变为变量并能够传递开始时应排序的内容,则可以创建一个简单的方法:
public static void sort(List<Employee> list, String nameToSortAtBeginning) {
Collections.sort(list, new Comparator<Employee>() {
@Override
public int compare(Employee o1, Employee o2) {
if(nameToSortAtBeginning.equals(o1.getEmployeeName()) && !nameToSortAtBeginning.equals(o2.getEmployeeName())) {
return -1;
} else {
return o1.getEmployeeName().compareTo(o2.getEmployeeName());
}
}
});
}
注意:如果某些员工姓名的值可能为空,则上述代码将不起作用。如果将null作为一个值,那么您可能还必须在comparator中添加null处理。为什么您不能仅使用自定义comparator对员工姓名进行排序(或者让员工实现comparable,以便bbb在自然顺序中排名第一)?似乎是显而易见的解决方案。我必须使用哪种顺序,ASC或DESC。如果我使用ASC“aaa”将排在第一位,或者如果我使用DESC“ccc”总是排在第一位。但是我想使用一些特定的值,比如“bbb”。就像我写的那样,你必须使用自定义比较器,你自己编写或者以同样的方式实现Compariable。为什么你不能使用自定义比较器对员工姓名进行排序(或者让员工实现Compariable,以便bbb是自然顺序中的第一个)?似乎是显而易见的解决方案。我必须使用哪种顺序,ASC或DESC。如果我使用ASC“aaa”将排在第一位,或者如果我使用DESC“ccc”总是排在第一位。但是我想要一些特定的值,比如“bbb”。就像我写的,你必须使用一个自定义的比较器,你自己写或者以同样的方式实现comparable。但是我需要在runtime@Srinivasan这仍然有效,只需替换“bbb”
您传入变量,而不是硬编码。if语句中的代码缺少括号。另外:如果lhs和rhs employeeNames都是“bbb”,则应返回0而不是1。这可能会导致抛出异常,因为它违反了可比较的契约。最后但并非最不重要的是,它实际上将“bbb”排序为最后一个元素,而不是第一个元素。@OHGODSPIDERS fixed请不要鼓励新手省略大括号。但我需要在runtime@Srinivasan这仍然有效,只需替换“bbb”
您传入变量,而不是硬编码。if语句中的代码缺少括号。另外:如果lhs和rhs employeeNames都是“bbb”,则应返回0而不是1。这可能会导致抛出异常,因为它违反了可比较的契约。最后但并非最不重要的是,它实际上将“bbb”作为最后一个元素排序,而不是第一个元素。@OHGODSPIDERS Fixed请不要鼓励新手省略大括号。