2015-11-04 85 views
1

我有一個任務對象,有一個名稱和一個日期。日期值必須是String。一個示例是11/9/2015 23:0011/24/2015 12:00進行比較。 我需要幫助,爲此編寫compareTo(),以便最早顯示最早日期的任務。我所擁有的是不正確的,因爲它沒有正確比較。我知道有替代品,但它是必需的,我用String來做到這一點。我曾考慮使用.split()將mm/dd/yyyy分割爲"/",但不知道如何執行此操作。比較類型的日期字符串

public class Task implements Comparable<Task> { 
    /** Task name. */ 
    private String name; 
    /** Task due date. */ 
    private String dueDate; 

    /** 
    * Initializes a tasks name and due date. 
    * @param n Name 
    * @param d due date 
    */ 
    public Task(String n, String d) { 
     name = n; 
     dueDate = d; 
    } 

    /** 
    * Accessor for task name. 
    * @return Task name. 
    */ 
    public String getName() { 
     return name; 
    } 

    /** 
    * Accessor for task due date. 
    * @return Task due date. 
    */ 
    public String getDueDate() { 
     return dueDate; 
    } 

    /** 
    * Compares the due dates of the tasks to get the soonest to the front of the list. 
    * @param t The task to compare. 
    * @return The tasks in chronological order. 
    */ 
    @Override 
    public int compareTo(Task t) { //Need help here. 
     int val = dueDate.compareTo(t.getDueDate()); 

     if(val == 0) { 
      val = name.compareTo(t.getName()); 
     } 
     if(dueDate.compareTo(t.getDueDate()) > 0) { 
      val = -1; 
     } 
     if(dueDate.compareTo(t.getDueDate()) < 0) { 
      val = 1; 
     } 
     return val; 
    } 
+0

可以轉換爲Date對象然後比較嗎? – AbtPst

+0

[在Java中比較日期字符串](http:// stackoverflow。com/questions/10609596/comparison-date-strings-in-java) –

+0

@AbtPst不,我必須使用'String' – JCCS

回答

2

,你必須將日期作爲字符串並不意味着你不能將它轉換爲Date和使用該類的自然排序的事實:

@Override 
public int compareTo(Task t) { 
    // Handling ParseExceptions omitted for bravity's sake 
    SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm"); 
    Date d1 = df.parse(dueDate); 
    Date d2 = df.parse(t.getDueDate()); 

    int val = d1.compareTo(d2); 

    if(val != 0) { 
     return val;  
    } 
    return name.compareTo(t.getName()); 
} 
1

日期時間對象

我建議你在課堂上使用日期時間對象而不是字符串作爲成員。

Java 8及更高版本包含非常有用的java.time框架。使用這些新類(靈感來自Joda-Time),而不是那些臭名昭着的老類java.util.Date/.Calendar。

不需要解析日期時間輸入字符串。 java.time框架默認分析ISO 8601格式的任何字符串。對於其他格式,請定義您期望輸入的格式化程序模式,並讓java.time執行此操作。

時區

不知道他們的時區不能比擬的日期時間字符串作爲你的。也許這是UTC?或者你是否假設你所有的數據都是指特定的時區?

在下面的例子中,我任意假設一個時區America/Los_Angeles

示例代碼。

Java 8中的此示例代碼使用java.time.format包解析您的字符串以在構造函數中輸入,並再次在dueDateTimeAsAmericaLosAngeles方法中生成字符串表示形式。

通常最好在UTC時區保留日期時間值。然後根據用戶或其他軟件預期的時區進行調整。所以我們在UTC上存儲了一個Instant,在UTC的時間線上。對於特定時區,請創建一個ZonedDateTime對象。

如果違揹我的建議,你堅持把日期時間值存儲爲一個字符串,那麼你可以通過移動字符串解析到即時發生的地方來修改這段代碼。

package timestuff; 

import java.time.Instant; 
import java.time.ZoneId; 
import java.time.ZonedDateTime; 
import java.time.format.DateTimeFormatter; 

public class Task implements Comparable<Task> { 

    String title; 
    Instant due; 

    public Task (String title , String dateTimeAssumedToBeAmericaLosAngles) { 
     this.title = title; 
     ZoneId zoneId = ZoneId.of ("America/Los_Angeles"); 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("M/d/yyyy HH:mm").withZone (zoneId); // Example data: 11/24/2015 12:00 
     this.due = formatter.parse (dateTimeAssumedToBeAmericaLosAngles , Instant :: from); 
    } 

    @Override 
    public String toString() { 
     return "Task{ " + "title=" + title + " | instant=" + due + " }"; 
    } 

    @Override 
    public int compareTo (Task t) { 
     // Sort by the date-time of when this task is due. 
     int result = this.due.compareTo (t.due); 
     return result; 
    } 

    String dueDateTimeAsAmericaLosAngeles() { 
     ZoneId zoneId = ZoneId.of ("America/Los_Angeles"); 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("M/d/yyyy HH:mm").withZone (zoneId); // Example data: 11/24/2015 12:00 
     ZonedDateTime zdt = ZonedDateTime.ofInstant (this.due , zoneId); 
     String output = zdt.format (formatter); 
     return output; 
    } 

    public static void main (String[] args) { 
     Task t1 = new Task ("x" , "11/9/2015 23:00"); 
     Task t2 = new Task ("y" , "11/24/2015 12:00"); 
     int compared = t1.compareTo (t2); 
     System.out.println ("t1: " + t1 + " & t2: " + t2 + " compared: " + compared); 
    } 

} 

當運行:

T1:任務{標題= X | instant = 2015-11-10T07:00:00Z} & t2:任務{title = y | instant = 2015-11-24T20:00:00Z}比較:-1