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

时间:2010-05-18 12:06:07

标签: java list sorting

我有一个字符串列表:

List<String> listString  = new ArrayList<String>();
listString.add("faq");
listString.add("general");
listString.add("contact");

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

5 个答案:

答案 0 :(得分:15)

改为Collections.sort subList

    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]"

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]"

API链接

答案 1 :(得分:14)

我喜欢@ 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);
     }
});

答案 2 :(得分:11)

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

答案 3 :(得分:1)

您可以使用以下代码段,但对于非常大的列表可能会出现性能/内存问题。

public static List<String> sortSpecial(List<String> list, final String alwaysOnTopItem) {
    list.remove(alwaysOnTopItem);
    Collections.sort(list);

    List<String> result = new ArrayList<String>(list.size() + 1);
    result.add(alwaysOnTopItem);
    result.addAll(list);

    return result;
}

public static void main(String[] args) {
    List<String> listString = new ArrayList<String>();
    listString.add("faq");
    listString.add("general");
    listString.add("contact");
    String alwaysOnTopItem = "general";
    List<String> sortedList = sortSpecial(listString, alwaysOnTopItem);
    System.out.println(sortedList);
}

答案 4 :(得分:0)

好!题。如果我们要固定第一个元素和最后一个元素的位置,则可以像下面这样增强@Paul Tomblin's方法。请复制代码并尝试。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class CustomComparatorToFixedPosition {

  public static void main(String[] args) {
    List<Emp> empNames = new ArrayList<>();
    empNames.add(new Emp("name1"));
    empNames.add(new Emp("LastName"));
    empNames.add(new Emp("name2"));
    empNames.add(new Emp("FirstName"));
    empNames.add(new Emp("name3"));
    getSortedName(empNames).stream().forEach(emp -> System.out.println(emp.getName()));
  }

  public static List<Emp> getSortedName(List<Emp> empNames) {
    String first = "FirstName";
    String last = "LastName";
    Collections.sort(empNames, new Comparator<Emp>() {
      public int compare(Emp o1, Emp o2) {
        if (o1.getName().equalsIgnoreCase(first) || o2.getName().equalsIgnoreCase(last))
          return -1;
        if (o2.getName().equalsIgnoreCase(first) || o1.getName().equalsIgnoreCase(last))
          return 1;
        return o1.getName().compareTo(o2.getName());
      }
    });
    return empNames;
  }
}

class Emp {

  private String name;

  Emp(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

}