如何按升序和降序对带分隔符的字符串列表进行排序

时间:2016-01-20 04:56:55

标签: java list sorting data-structures comparator

我需要根据键中的不同分隔符对String列表进行排序。关键是日期,标题,来源,作者的连接。我需要按日期按降序排序列表,然后按标题和源按升序排序。除作者外,所有值可能为空,也可能不为空。 我添加了#'#'作为将日期与标题,来源和作者分开的分隔符 我添加' |'如果它们为空,则代替标题和来源。 我添加' *'如果日期为空,则代替日期

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]

1 个答案:

答案 0 :(得分:1)

如果两个日期都不为空并且您比较它们,那么您应该处理两个日期相同的情况,然后您应按标题和作者按升序排序。