Java列表应始终具有特定值作为第一项

Java列表应始终具有特定值作为第一项,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(

我有一个像下面这样的pojo

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请不要鼓励新手省略大括号。