我需要根据密钥中的不同分隔符对字符串列表进行排序。关键是日期,标题,来源,作者的连接。我需要按降序对日期进行排序,然后按升序对标题和源进行排序。除作者外,所有值都可以为空,也可以不为空。 我添加'#'作为分隔符以区分日期与标题,来源和作者 我添加'|'如果它们为空,则代替标题和来源。 我在发布日期的加 '*',如果日期为null如何按照升序和降序对带分隔符的字符串列表进行排序
Systen.out.print(listToSortKeys):
[2015-03-26 00:00:00.0#CAB,2015-03-26 00:00:00.0#ABC, 2011-06-29 00:00:00.0#EFG, 2011-06-29 00:00:00.0#DFG, *#||D, *#||C, *#|C2, *#|C1]
我怎样才能做到这一点使用comaparator:
Comparator<String> cmp = new Comparator<String>() {
public int compare(String o1, String o2) {
String[] keySplit1 = o1.split("#",2);
String[] keySplit2 = o2.split("#",2);
try{
if(!keySplit1[0].equals("*") && !keySplit2[0].equals("*")){ // if date is not null compare and sort in descending order
int dateCompare = sfd.parse(keySplit1[0]).compareTo(sfd.parse(keySplit2[0]));
if(dateCompare == -1){
return 1;
}
return dateCompare;
}
if(keySplit1[0].equals("*") && keySplit2[0].equals("*")){ // if both the date are null then do normal sort on string
return o1.compareTo(o2);
}
if((keySplit1[0].equals("*") && !keySplit2[0].equals("*")) || (!keySplit1[0].equals("*") && keySplit2[0].equals("*"))){ // if one of date is null then move it towards end of list
if(keySplit1[0].equals("*")){
return -1; // line 18
}else{
return 1; // line 20
}
}
}catch(Exception e){
e.printStackTrace();
}
return keySplit1[1].compareTo(keySplit2[1]);
}
};
Collections.sort(listToSortTheKeys, cmp);
输出1:
[*#|C1,*#|C2,*#||C,*#||D,2015-03-26 00:00:00.0#CAB, 2015-03-26 00:00:00.0#ABC, 2011-06-29 00:00:00.0#EFG, 2011-06-29 00:00:00.0#DFG]
如果我互换返回值在第18行和第20行,那么我得到
输出2:
[2015-03-26 00:00:00.0#CAB, 2015-03-26 00:00:00.0#ABC, 2011-06-29 00:00:00.0#EFG, 2011-06-29 00:00:00.0#DFG, *#|C1, *#|C2, *#||C, *#||D]
预期输出:
[2015-03-26 00:00:00.0#ABC,2015-03-26 00:00:00.0#CAB,2011-06-29 00:00:00.0#DFG,2011-06-29 00:00:00.0#EFG,*#|C1,*#|C2,*#||C,*#||D]
怎么样,而不是自己做任何比较,将每个记录转换成一个字符串,然后按照您描述的规则自然排序。例如做一个规范化的方法,它做的转换,然后比较将是公共int比较(字符串o1,字符串o2){返回规范化(o1).compareTo(规范化(o2))} – slipperyseal
哦,你提到了混合的升序和降序..我的想法可能不会那么好 – slipperyseal
当我需要按日期降序排序它时,问题就出现了,但是按照剩余字符串升序排列。我不确定的是我们可以使用单个比较器来执行降序和升序排序。 –