Java按名称排序对象列表,但一个对象应始终保持在顶部

ssl*_*ssl 3 java sorting comparator java-8

class Manager
{
    private int id;
    private String name;

    public Manager(int id, String name)
    {
      this.id = id;
      this.name = name;
    }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
}

List<Manager> names = new ArrayList<>();
names.add(new Manager(1, "Robert"));
names.add(new Manager(2, "Paul"));
names.add(new Manager(3, "None"));
names.add(new Manager(4, "Nancy"));
names.add(new Manager(4, "Nancy"));

names.stream().sorted(
                Comparator.comparing(n->n.getName())).collect(Collectors.toList());


List<String> names = new List<String>();
names.add("Robert");
names.add("Paul");
names.add("None");
names.add("Nancy");
names.add("Nancy");


names.stream().sorted().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我需要在Java 8中对字符串列表进行排序,我可以使用下面的逻辑轻松地完成它,但我想在下面的列表中始终显示None.结果必须如此.我需要获取List of Managers对象的排序顺序

None
Jhon
Nancy
Paul
Run Code Online (Sandbox Code Playgroud)

我的代码:

List<String> names = new List<String>();
names.add("Robert");
names.add("Paul");
names.add("None");
names.add("Nancy");
names.add("Jhon");


names.stream().sorted().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

字符串总是需要在第一位.

Hol*_*ger 5

您可以使用

List<Manager> sorted = names.stream()
    .sorted(Comparator.comparing(Manager::getName,
              Comparator.comparing((String s) -> !s.equals("None"))
                        .thenComparing(Comparator.naturalOrder())))
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

排序到新列表或使用

names.sort(Comparator.comparing(Manager::getName,
              Comparator.comparing((String s) -> !s.equals("None"))
                        .thenComparing(Comparator.naturalOrder())));
Run Code Online (Sandbox Code Playgroud)

就地排序,这可能是一个可变的列表,如ArrayList.

  • 你可以把它们放在最后,而不是简单地删除not(`!`)运算符. (4认同)