2013-10-06 36 views
-1

我有一個arraylist包含"2013-7-13 \n 12 hour(s) 23 minute(s) "這樣的記錄。我如何才能按日期排序。排序Arraylist的字符串,但只有日期

一段代碼:

String date1 = c.getString(c.getColumnIndex(TabProDB.KEY_DATE)); 
String time1 = c.getString(c.getColumnIndex(TabProDB.KEY_TIME)); 
String date_time1 = date1 + "\n" +time1; 
Toast.makeText(History.this, date_time1, Toast.LENGTH_SHORT).show(); 
listItems.add(date_time1); 
+0

使用自定義類!包含** **日期對象**和日期 –

+0

的字符串表示形式的類是它的時間戳列表列表,還是具有時間戳記作爲其屬性之一的對象的列表列表。 –

+0

千禧年比較對象一個接一個。 –

回答

2

創建自己的Comparator<String>實現,類似如下:

注意,沒有錯誤檢查,它只是告訴你如何能做到這一點。

public static void main(String[] args) { 

    List<String> strings = 
     Arrays.asList("2013-7-13 \n 12 hour(s) 23 minute(s)", 
      "2013-7-10 \n 12 hour(s) 23 minute(s)"); 

    Collections.sort(strings, new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 

     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 

     Date date1; 
     Date date2; 
     try { 
      date1 = format.parse(o1.split(" ")[0]); 
      date2 = format.parse(o2.split(" ")[0]); 
     } catch (ParseException e) { 
      throw new IllegalArgumentException("Could not parse date!", e); 
     } 

     return date1.compareTo(date2); 
     } 
    }); 


    System.out.println(strings); 

    } 
0

的Array.sort可以傳遞一個自定義比較器。如果您知道所有字符串都是完全相同的格式,只需根據子字符串創建比較器即可。

您也可以實現自己的排序,但這並不理想,因爲Java已經提供了該功能。

0

步驟,你可以嘗試做...

- >如果你確信「\ n」中的每個條目可以說Ÿ則僅使用組織各項目獲取日期部分。 apache.commons.lang.StringUtils.substringBefore(字符串,字符串)說X

- >下一步是使用java.text.SimpleDateFormat中(YYYY-MM-DD)x到日期解析

- >然後可以使用任何集合對象可以包含鍵和值的對,其中關鍵的是x和y值(使用TreeMap的這可以自動排序的值。)

問題的這種方法:如果x部分在您的陣列的多個條目中很常見,則此方法不起作用。


試着運行這段代碼。最後的打印語句會給你排序的結果。地圖內的值是你正在尋找的。

class TestClass { 
    public void checkThis() throws ParseException { 
     String[] sampleValues = new String[3]; 
     sampleValues[0]= "2013-7-13 \n 12 hour(s) 23 minute(s) "; 
     sampleValues[1]= "2013-8-14 \n 12 hour(s) 23 minute(s) "; 
     sampleValues[2]= "2013-5-16 \n 12 hour(s) 23 minute(s) "; 
     System.out.println("--> before"+ sampleValues); 

     String x= null; 
     Date date =null; 
     Map<Date, String> map = new TreeMap<Date, String>(); 
     SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
     for (String y : sampleValues) { 
      x = StringUtils.substringBefore(y, " \n"); 
      date= formatter.parse(x);   
      map.put(date, y); 
     } 

     System.out.println(map.keySet()); 
    } 
} 
+0

它可能會遇到你說的問題。因此,例如「12小時23分鐘」的「x」將具有重複記錄。 – user2799726

+0

x是可以工作的「2013-7-13」 – Rupesh

+0

。你能給我一些實際的代碼,我不熟悉樹形圖,謝謝 – user2799726

1

雖然ü應該通過使傳遞的日期和時間類對象...,使一個ArrayList的出這個類的都遵循面向對象的風格.. 反正...這個代碼可以幫助你出來!

記住字符串比較和日期和時間比較兩種 不同的東西,你也可以重構下面的代碼爲每回合需要

public class MyComparator implements Comparator<String> { 
    @Override 
    public int compare(String o1, String o2) { 
     int result = o1.compareTo(o2); 
     return result; 
    } 
} 
Now use Collection.sort method 
List<String> dateTimeList = new ArrayList<String> 
Collections.sort(dateTimeList, new MyComparator()); 
+0

對不起,我爲什麼需要在這裏dateTimeList?我已經有一個名爲「listItems」的列表 – user2799726

+0

@ user2799726它只是一個變量名,因爲在你的代碼中date_time1是日期和時間的連接... –

0

第一步

解析您的String成實際Date object`:

final String s = "2013-7-13 \n 12 hour(s) 23 minute(s)"; 
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-dd \n hh 'hour(s)' 23 'minute(s)'"); 
final Date d = sdf.parse(s); 

日期不要存儲爲字符串

第二步

把所有這些新Date s轉換您的List並調用Collections.sort

在任何點以後你可以使用相同的SimpleDateFormat(或一個完全不同的一個)來格式化Date回一個String

final String form = sdf.format(d); 
System.out.println(form); 

輸出:

2013年7月13日\ n 12小時23分鐘