2016-01-20 58 views
2

我需要根據密鑰中的不同分隔符對字符串列表進行排序。關鍵是日期,標題,來源,作者的連接。我需要按降序對日期進行排序,然後按升序對標題和源進行排序。除作者外,所有值都可以爲空,也可以不爲空。 我添加'#'作爲分隔符以區分日期與標題,來源和作者 我添加'|'如果它們爲空,則代替標題和來源。 我在發佈日期的加 '*',如果日期爲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] 
+0

怎麼樣,而不是自己做任何比較,將每個記錄轉換成一個字符串,然後按照您描述的規則自然排序。例如做一個規範化的方法,它做的轉換,然後比較將是公共int比較(字符串o1,字符串o2){返回規範化(o1).compareTo(規範化(o2))} – slipperyseal

+0

哦,你提到了混合的升序和降序..我的想法可能不會那麼好 – slipperyseal

+0

當我需要按日期降序排序它時,問題就出現了,但是按照剩餘字符串升序排列。我不確定的是我們可以使用單個比較器來執行降序和升序排序。 –

回答

1

當這兩個日期都沒有空,你對它們進行比較,那麼你應該處理時,這兩個日期是相同的話,那麼你應該在標題和作者排序按升序排列。

+0

您的建議奏效。我嘗試了幾個其他的例子,它完全適用於較小的集合,然而,當試圖用更大的集合說1000個字符串由於某種原因它不。不過,我通過將它分成兩個列表,一列使用日期字段和一列空列,然後進行排序和合並。我也會接受你的回答。謝謝。 –

相關問題