使用Object
列表,其中一个项目为空String
。尝试编写将返回排序列表的方法。通过排序意味着列表的第一个项值应始终为空String
。
由于我不想操纵未排序的列表,我正在创建一个新列表进行排序。
到目前为止,我的代码是:
private List<LoggerConfig> sort(List<LoggerConfig> unSortedList) {
List<LoggerConfig> sortedList = new ArrayList<LoggerConfig>(unSortedList);
//What to do here
return sortedList;
}
看了很多SO
帖子,但很困惑。
答案 0 :(得分:2)
您可以信任String.compareTo
以匹配您寻求的订单。这是比较者:
new Comparator<LoggerConfig>() {
@Override
public int compare(LoggerConfig o1, LoggerConfig o2) {
return (o1.getName().compareTo(o2.getName()));
}
};
或直接在特定课程中实施Comparable
(此处为Dummy)
class Dummy implements Comparable<Dummy>{
String name;
public int compareTo(Dummy o) {
return this.name.compareTo(o.name);
}
}
原因:
String.compareTo
检查两者的前几个字符以找到差异(直到两者的最小长度),如果它们匹配,则长度用于产生差异,最长的将在最短之后(shortest.compareTo(longuest)
。 {1}}将返回负值(长度差异))。
在这种情况下,"".compareTo("abc")
,空字符串中没有字符,因此跳过第一个检查,并使用长度来比较String
s,因此空String
将永远被视为首先与任何“非空”String
上一个Dummy
类的示例(只需要添加构造函数Dummy(String)
:
public class Main {
public static void main(String[] args) {
List<Dummy> dummies = new LinkedList<Dummy>();
dummies.add(new Dummy("abc.com.core"));
dummies.add(new Dummy(""));
dummies.add(new Dummy("abc.com.core.def"));
System.out.println("BEFORE : " + dummies);
Collections.sort(dummies);
System.out.println("AFTER : " + dummies);
}
}
输出:
BEFORE : [abc.com.core, , abc.com.core.def]
AFTER : [, abc.com.core, abc.com.core.def]
答案 1 :(得分:1)
您可以将此条件放在比较器中,以便考虑具有空值的元素&#34; less&#34;比其他元素,以便它显示在排序列表的开头。尝试这样的事情:
Collections.sort(sortedList, new Comparator<LoggerConfig>() {
@Override
public int compare(LoggerConfig o1, LoggerConfig o2) {
if(o1.getName().isEmpty(){
return -1;
}
if(o2.getName().isEmpty(){
return 1;
}
return (o1.getName().compareTo(o2.getName()));
}
});
我没有对此进行测试,但这应该能够明确这个想法。如果空元素显示在列表末尾,请交换-1
和1
。
如果您的List很大并且排序需要花费很多时间,那么在排序之前删除空元素,然后排序,然后将元素放在开头可能是个更好的主意。
答案 2 :(得分:1)
Comparator
解决方案对我来说似乎是可行的;您缺少的是实施compare
方法,以便它能够满足您的需求。
Collections.sort(sortedList, new Comparator<LoggerConfig>() {
@Override
public int compare(LoggerConfig o1, LoggerConfig o2) {
if(o1.getName().equals("")){
return -1;
} else if(o2.getName().equals("")) {
return 1;
} else {
return (o1.getName().compareTo(o2.getName()));
}
}
});
根据Java docs,Comparator
有一个compare
方法返回一个int
所以你需要的Comparator
应该返回两个字符串的比较,如果它们与""
不同,并且如果第一个(或第二个)字符串则为-1(或1)是空的。