对元素仍在第一个位置的列表进行排序

Mer*_*cer 3 java sorting list

我有一个String列表:

List<String> listString  = new ArrayList<String>();
listString.add("faq");
listString.add("general");
listString.add("contact");
Run Code Online (Sandbox Code Playgroud)

我在列表上做了一些处理,我想对这个列表进行排序,但我希望"general"始终以第一个位置结束.谢谢 ;)

pol*_*nts 15

Collections.sortsubList而不是.

    List<String> list = new ArrayList<String>(
        Arrays.asList("Zzz...", "Two", "One", "Three")
    );
    Collections.sort(list.subList(1, list.size()));
    System.out.println(list);
    // "[Zzz..., One, Three, Two]"
Run Code Online (Sandbox Code Playgroud)

API链接

  • subList(int fromIndex, int toIndex)
    • 返回指定的fromIndex,包含的和toIndex独占的列表部分的视图.返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,反之亦然.返回的列表支持此列表支持的所有可选列表操作.

如果特殊元素不在索引0处,那么只需将其放在那里,然后按如下方式对其进行排序:

    List<String> list = new ArrayList<String>(
        Arrays.asList("Four", "Five", "Zzz...", "Two", "One", "Three")
    );
    Collections.swap(list, list.indexOf("Zzz..."), 0);
    Collections.sort(list.subList(1, list.size()));
    System.out.println(list);
    // "[Zzz..., Five, Four, One, Three, Two]"
Run Code Online (Sandbox Code Playgroud)

API链接


Pau*_*lin 15

我喜欢@ Petar的方法,但另一种方法是使用自定义比较器对其进行排序,该比较器总是说"一般"在它被比较之前.

Collections.sort(list, new Comparator<String>()
  {
     int compare(String o1, String o2)
     {
         if (o1.equals(o2)) // update to make it stable
           return 0;
         if (o1.equals("general"))
           return -1;
         if (o2.equals("general"))
           return 1;
         return o1.compareTo(o2);
     }
});
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这可能不稳定,具体取决于Collections.sort使用的算法,因此您可能希望在将它们与"general"进行比较之前测试o1和o2是否相等. (3认同)

Pet*_*hev 11

对列表进行排序,其中没有"general",然后将其添加到开头.

  • @poly,我强烈反对这是一个"可怕的黑客".这是非常直接和有效的. (9认同)
  • @poly,这在很大程度上取决于此列表是一次还是多次构建.如果它只构建一次,那么添加除"general"之外的所有内容,对其进行排序,然后在前面添加"general"是合理的.它是多次构建的,或者在构建之后进行修改,然后是的,这是一个糟糕的选择. (2认同)