我有一个字符串列表:
List<String> listString = new ArrayList<String>();
listString.add("faq");
listString.add("general");
listString.add("contact");
我在列表上做了一些处理,我想对这个列表进行排序,但我希望“general”始终以第一个位置结束。 谢谢;)
答案 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]"
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]"
Collections.swap(List<?> list, int i, int j)
答案 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;
}
}