如何在Java中声明日期类型变量并基于日期对Transaction类对象进行排序?
嗨,我来帮你搞定这个交易类排序的问题!咱们一步步来:
第一步:完善Transaction类的Comparable实现
你已经让类实现了Comparable<Transaction>接口,但还需要重写compareTo方法,明确按照startDate来排序。另外,你的类目前都是私有属性,得加构造方法或者setter让外部能传入日期和其他属性,不然没法创建实例。
这里给你补全后的完整类代码:
import java.util.Arrays; import java.util.Date; import java.util.List; public class Transaction implements Comparable<Transaction> { private Dog dogID; private Date startDate; private Date departureDate; private List<Integer> serviceLevel = Arrays.asList(1, 2, 3); private List<Integer> ratePerDay = Arrays.asList(89, 129, 149); private double totalcharge; private double deposit; // 构造方法:方便外部传入必要属性创建实例 public Transaction(Dog dogID, Date startDate, Date departureDate) { this.dogID = dogID; this.startDate = startDate; this.departureDate = departureDate; // 这里可以根据serviceLevel和日期差计算totalcharge和deposit,按需补充逻辑 } // 重写compareTo方法,按startDate升序排序 @Override public int compareTo(Transaction other) { // 处理startDate为null的情况,避免空指针异常 if (this.startDate == null && other.startDate == null) { return 0; } if (this.startDate == null) { return -1; // 把null值排在前面,也可以返回1让null排后面,按需调整 } if (other.startDate == null) { return 1; } // 直接复用Date自带的compareTo方法完成日期比较 return this.startDate.compareTo(other.startDate); } // 重写toString方便验证排序结果 @Override public String toString() { return "Transaction{" + "dogID=" + dogID + ", startDate=" + startDate + '}'; } // 假设Dog是一个简单实体类,这里内嵌示例 public static class Dog { private String id; public Dog(String id) { this.id = id; } @Override public String toString() { return id; } } // 按需添加getter/setter方法 public Date getStartDate() { return startDate; } }
第二步:创建交易对象并完成排序
现在你可以创建多个带不同日期的Transaction实例,然后用Collections.sort()(或者Java 8+的List.sort())完成排序。这里给你写个main方法示例:
import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; public class TransactionSortDemo { public static void main(String[] args) { // 创建5个带不同起始日期的交易对象 // 注意:Date的构造方法已过时,这里为了兼容你的代码示例,实际开发推荐用新日期API List<Transaction> transactions = new ArrayList<>(); transactions.add(new Transaction(new Transaction.Dog("狗1"), new Date(123, 5, 15), new Date(123, 5, 20))); // 2023年6月15日 transactions.add(new Transaction(new Transaction.Dog("狗2"), new Date(123, 4, 10), new Date(123, 4, 15))); // 2023年5月10日 transactions.add(new Transaction(new Transaction.Dog("狗3"), new Date(123, 6, 5), new Date(123, 6, 10))); // 2023年7月5日 transactions.add(new Transaction(new Transaction.Dog("狗4"), new Date(123, 3, 20), new Date(123, 3, 25))); // 2023年4月20日 transactions.add(new Transaction(new Transaction.Dog("狗5"), new Date(123, 5, 1), new Date(123, 5, 6))); // 2023年6月1日 // 直接排序:因为Transaction实现了Comparable,Collections.sort会自动用我们定义的规则 Collections.sort(transactions); // 输出排序结果验证 System.out.println("按起始日期升序排序后的交易:"); for (Transaction t : transactions) { System.out.println(t); } } }
进阶建议:使用Java 8+的日期API
java.util.Date是过时的API,存在线程不安全、使用不直观的问题。如果你的项目是Java 8及以上,强烈建议换成java.time.LocalDate(仅需日期)或LocalDateTime(需日期时间)。
修改后的核心代码示例:
import java.time.LocalDate; public class Transaction implements Comparable<Transaction> { private Dog dogID; private LocalDate startDate; private LocalDate departureDate; // ...其他属性不变 public Transaction(Dog dogID, LocalDate startDate, LocalDate departureDate) { this.dogID = dogID; this.startDate = startDate; this.departureDate = departureDate; } @Override public int compareTo(Transaction other) { // LocalDate的compareTo更安全易用,无需额外处理(若要兼容null可参考之前的逻辑) return this.startDate.compareTo(other.startDate); } // 创建实例的方式更直观: // transactions.add(new Transaction(new Dog("狗1"), LocalDate.of(2023, 6, 15), LocalDate.of(2023, 6, 20))); }
内容的提问来源于stack exchange,提问作者user18402724
相关产品推荐
相关产品推荐

