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
Trả lời
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);
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);
Đây là O (N log N), trong khi Collections.max là O (N). – Richante
Đặt chúng vào Danh sách và sử dụng Collections.max
.
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.*/);
Đ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
@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
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());
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
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
Nhiều lần hoặc chỉ một lần? – Tudor
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
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