如何在Java中对列表进行分组排序?

如何在Java中对列表进行分组排序?,java,collections,Java,Collections,我有这门课: class Employee { String name; int type; // 0 = ADMIN, 1 = NON-ADMIN } 现在我有一份员工名单 List<Employee> liste; 列表列表; 我是否可以对列表进行排序,使所有管理员员工都进行排序,并在结果中显示在所有非管理员排序员工之前?使用比较器,先按类型排序,然后按名称排序(假设这是您想要的) 假设这是你真正想要的,这样的事情应该会起作用。 字符串的比较 这是词典排序的

我有这门课:

class Employee {
    String name;
    int type; // 0 = ADMIN, 1 = NON-ADMIN
}
现在我有一份员工名单

List<Employee> liste;
列表列表;

我是否可以对列表进行排序,使所有管理员员工都进行排序,并在结果中显示在所有
非管理员
排序员工之前?

使用比较器,先按类型排序,然后按名称排序(假设这是您想要的)

假设这是你真正想要的,这样的事情应该会起作用。
字符串
的比较

这是词典排序的定义。如果有两个字符串 不同,那么它们在某个索引中有不同的字符 这是两个字符串的有效索引,或者它们的长度为 不同,或者两者都不同。如果它们在一个或多个位置具有不同的字符 指数位置,设k为此类指数的最小值;然后是字符串 其在位置k处的字符具有较小的值,由 使用<运算符,按字典顺序优先于另一个字符串。在里面 在这种情况下,compareTo返回两个字符的差值 两个字符串中位置k处的值--即值:

this.charAt(k)-另一个string.charAt(k)

如果没有索引 它们不同的位置,然后是较短的字符串 按字典顺序在较长字符串之前。在这种情况下,比较 返回字符串长度的差值,即 价值:

this.length()-另一个String.length()


那是文件上的。不要依赖compareTo精确返回1,0,-1。相反,只要记住+,0,-。例如,如果长度差为1,类型差为-1,那么您的比较器将是错误的

您可以制作一个复合比较器:

list.sort(Comparator.comparingInt(Employee::getType).thenComparing(Employee::getName));

这样,非管理员将首先出现:

List<Employee> temp = new ArrayList<Employee>();
while(it.hasNext()){
        Employee employee = it.next();
        if (employee.getType() == 0){
            it.remove();
            temp.add(employee);
        }
}
staff.addAll(temp);
List temp=new ArrayList();
while(it.hasNext()){
Employee=it.next();
if(employee.getType()==0){
it.remove();
临时添加(员工);
}
}
staff.addAll(临时);

我建议您使用
类型的枚举,而不是幻数。您能提供comparator的实现吗。我试过这样做:java.util.Collections.sort(list,(a,b)->a.name.compareTo(b.name)+(a.type-b.type))@只要逻辑正确,我就会用它。我知道应该避免使用幻数,“分组并对组进行排序”和“分组并对组进行排序”是有区别的。你的标题是关于第一个,而你的解释是关于后一个。如果你回溯,你只能一次完成——否则你不能在管理员组和非管理员组内部排序(只添加到他们中)。根据你在问题中提出的问题,你的比较器实现是错误的。我喜欢这个功能实现
List<Employee> temp = new ArrayList<Employee>();
while(it.hasNext()){
        Employee employee = it.next();
        if (employee.getType() == 0){
            it.remove();
            temp.add(employee);
        }
}
staff.addAll(temp);