2013-04-04 7 views
13

Tôi có ba ngày trong Java: a, b, c. Bất kỳ hoặc tất cả những ngày này có thể là null. Cách hiệu quả nhất để xác định ngày sớm nhất trong một, b, c, mà không có khối lớn nếu-else là gì?Tìm ngày sớm nhất trong 3 ngày

+5

và bạn đã thử điều gì không hiệu quả? – asgs

+0

Bạn có cần biết ngày nào là sớm nhất (tức là buộc nó trở lại biến), hay chỉ là giá trị? –

+3

Bạn có thể chuyển đổi từng Ngày thành biểu diễn mili giây và sử dụng một phép tính kết hợp.min để xác định giá trị nhỏ nhất – MadProgrammer

Trả lời

19

Không nhận được xung quanh kiểm tra null, nhưng với một số refactoring bạn có thể làm cho nó không đau.

Tạo một phương pháp mà một cách an toàn so sánh hai thời điểm:

/** 
* Safely compare two dates, null being considered "greater" than a Date 
* @return the earliest of the two 
*/ 
public static Date least(Date a, Date b) { 
    return a == null ? b : (b == null ? a : (a.before(b) ? a : b)); 
} 

sau đó kết hợp các cuộc gọi đến rằng:

Date earliest = least(least(a, b), c); 

Trên thực tế, bạn có thể làm điều này một phương pháp chung cho bất kỳ Comparable:

public static <T extends Comparable<T>> T least(T a, T b) { 
    return a == null ? b : (b == null ? a : (a.compareTo(b) < 0 ? a : b)); 
} 
5

Vâng, 'hiệu quả' có một số ý nghĩa khác nhau sau khi(), nhưng tôi không nghĩ rằng sẽ có một vấn đề hiệu quả khi so sánh ba ngày. Trong thực tế, nó thực sự rẻ. Bạn có thể thử phương pháp này:

SortedSet<Date> dates = new TreeSet<Date>(); 
dates.add(date1); 
dates.add(date2); 
// ... 
dates.add(dateN); 
Date earliest = dates.first(); 

Hoặc, có thể thêm thanh lịch:

for (Date date : someDates) { 
    if (date != null) { 
     dates.add(date(; 
    } 
} 
0

Bạn có thể sử dụng

date1.compareTo(anotherDate) 

Returns:

giá trị 0 nếu ngày đối số là bằng ngày này; một giá trị nhỏ hơn 0 nếu ngày này là trước đối số ngày; và giá trị lớn hơn 0 nếu ngày này sau đối số ngày.

Ném:

NullPointerException - 

nếu anotherDate là null.

0

chỉ là một phiên bản như một ý tưởng và để cho vui

new Date(Math.min(a != null ? a.getTime() : Long.MAX_VALUE 
, Math.min(b != null ? b.getTime() : Long.MAX_VALUE 
, c != null ? c.getTime() : Long.MAX_VALUE))) 
1

sử dụng trước và sau:

/** 
    * find Min Dates 
    * @param date1 
    * @param date2 
    * @return 
    */ 
    public static Date minDate(Date date1, Date date2) { 
     // if date1 before date2 then return date1 else return date2 
     return date1.before(date2) ? date1 : date2; 
    } 
    /** 
    * find Max Dates 
    * @param date1 
    * @param date2 
    * @return 
    */ 
    public static Date maxDate(Date date1, Date date2) { 
     // if date1 after date2 then return date1 else return date2 
     return date1.after(date2) ? date1 : date2; 
    } 
1

Một cách khác là sử dụng java.util.Collections.min(collection):

Returns: yếu tố tối thiểu của được thu thập, theo thứ tự tự nhiên của các yếu tố của nó.

public static Date getEarliestDate(List<Date> dates) { 

    if (dates == null || dates.isEmpty()) 
     return null; 

    dates.removeIf(Objects::isNull); 

    return dates.isEmpty() ? null : Collections.min(dates); 
}