2012-04-12 26 views
5

Tôi có khoảng 8 biến ngày (java.util.Date) với các tên biến khác nhau. Cách hiệu quả nhất/tốt nhất để chọn (tối đa) gần đây nhất của những ngày này là gì?Cách lấy tập hợp biến số ngày gần đây nhất trong java

+0

Nhiều lần hoặc chỉ một lần? – Tudor

+0

chỉ một lần. tất cả các giá trị biến ngày có thể khác nhau. Tôi chỉ cố gắng tìm ngày gần đây nhất hiệu quả để hiển thị trên trang jsp. – user6123723

+0

Giá trị mới nhất của bạn luôn là số tiền tối đa hoặc bạn cần phải tính cho các ngày trong tương lai? – eabraham

Trả lời

17

Lý tưởng nhất, lưu trữ chúng trong một bộ sưu tập - điều này có thể có ý nghĩa về mặt thiết kế chương trình của bạn anyway. Nếu bạn có, ví dụ: đối tượng Danh sách, bạn có thể làm:

Collections.max(dates); 
2

Date có thể so sánh, vì vậy thêm tất cả chúng vào một danh sách, và sử dụng Collections.max() để tìm ngày (mới nhất) lớn nhất:

List<Date> dates = new ArrayList<Date>(); 
dates.add(foo); 
dates.add(bar); 
... etc 
Date latest = Collections.max(list); 

Trên thực tế, nếu bạn muốn nhận được ưa thích, bạn có thể làm điều này:

public static <T extends Comparable<T>> T max(T... items) { 
    return Collections.max(Arrays.asList(items)); 
} 

Và gọi nó là như thế này:

Date latest = MyClass.max(foo, bar, fred); 

Nhưng nó sẽ cũng làm việc cho bất kỳ Comparable:

Integer biggest = MyClass.max(3, 7, 4, 1); 
+2

Đây là O (N log N), trong khi Collections.max là O (N). – Richante

6

Đặt chúng vào Danh sách và sử dụng Collections.max.

3

Vì bạn đang lưu trữ tất cả các ngày của bạn trong các biến khác nhau, bạn cần phải làm điều gì đó giống như hàm sau varargs và vượt qua tất cả các biến của bạn tắt nó:

protected Date getMostRecentDate(Date ... dates) { 
    Arrays.sort(dates); 
    return myDateArray[dates.length - 1]; 
} 

Sau đó, bạn muốn gọi nó là như vậy :

Date mostRecent = getMostRecentDate(date1, date2, date3 /* etc.*/); 
+0

Điều này không hiệu quả vì anh ta chỉ muốn nhận tối đa một lần. Sắp xếp lấy O (N * logN) trong khi một hoạt động tối đa là O (N). – Tudor

+0

@Tudor chắc chắn, mặc dù trong tất cả sự công bằng, với N nhỏ (và tôi giả định rằng anh ta có nhỏ N b/c nếu không duy trì một bó toàn bộ các lĩnh vực khác nhau sẽ có rất nhiều công việc), sẽ không có nhiều khác biệt. – stevevls

1

Thêm tất cả vào một bộ sưu tập và sau đó sắp xếp nó, hoặc thêm chúng vào một bộ sưu tập đó là ra lệnh ở nơi đầu tiên, chẳng hạn như PriorityQueue:

PriorityQueue<Date> dateQ = new PriorityQueue<Date>(); 
dateQ.add(someDate); 
dateQ.add(anotherDate); 
dateQ.add(thirdDate); // etc... 
System.out.println("Max date is: " + dateQ.peek()); 
+0

Hiệu quả của việc so sánh này với việc thực hiện với một bộ sưu tập thông thường như thế nào? – user6123723

+0

Câu hỏi hay. Điều này sẽ là O (N log N), giống như thêm nó vào một danh sách và sau đó sắp xếp. Tuy nhiên, Collections.max (như được tham chiếu trong một số câu trả lời khác) là O (N) vì vậy điều đó chắc chắn hiệu quả hơn câu trả lời của tôi. – mongiesama

Các vấn đề liên quan