假设有一个名为Product的类,它具有两个名为p1和p2的乘积对象,它们具有以下字段:
P1->整数productId = 123,字符串名称=“ iPhoneS8”,整数单价 = 1000,字符串datMfs =“ 12/18/2017”。 P2-> int productId = 124,字符串名称=“ Samsung Galaxy S8”,int unitPrice = 1200,字符串datMfs =“ 05/22/2016”。
第一个问题是
1),为产品编写一个Java代码,包括getter和setter 方法,包括默认值在内的任何三个重载构造函数。我的 解决方案代码如下。
class Product {
Product() {//default Constractor
}
Product(int price) {//Overloaded Constractor1
}
Product(String name) {//Overloaded Constractor2
}
Product(String name, double pri) {//Overloaded Constractor3
}
Product(int name, double pri) {//Overloaded Constractor4
}
// The following is the product fields
private int productId;
private String name;
private int unitPrice;
private String dateMdft;
//The following is getters and setters
public int getproductId() {
return productId;
}
public void setProductId(int productId) {
this.productId = productId;
}
public String getproductName() {
return name;
}
public void setProductname(String name) {
this.name = name;
}
public int getproductunitPrice() {
return unitPrice;
}
public void setUnitPrice(int unitPrice) {
this.unitPrice = unitPrice;
}
public int getUnitPrice() {
return unitPrice;
}
public void setDateMan(String dateMdft) {
this.dateMdft = dateMdft;
}
public String getDateManftd(String dateMdft) {
return dateMdft;
}
第二个问题是
2),编写一个名为printOutedDatedProduct(从上面开始)的方法,然后 遍历对象并仅打印出数据 将过时的产品以 CSV格式显示在屏幕上。该方法应打印 124,三星Galaxy S8,1200,2016年5月22日。
我真的很努力地编写方法并打印出过时的产品,因此,如果有人帮助我,我非常感谢社区。我也很乐意就第一个问题的解决方案发表任何意见。非常感谢!
答案 0 :(得分:0)
我建议将日期存储在LocalDate
对象中。为什么选择LocalDate?这是一个编写良好且经过测试的日期维护类。
如何实例化和比较:
LocalDate d1 = LocalDate.of(2000, 06, 26);//YYYY-MM-DD
LocalDate d2 = LocalDate.now();
System.out.println(d1.compareTo(d2));//if d1 < d2, returns negative integer (difference between dates), otherwise positive integer.
d1.compareTo(d2)
是什么?它返回一个整数,表示日期之间的差。它采用不匹配的日期的第一项,并从第一项中减去第二项。例如:2019-03-14
与现在(2019-03-29
)相比将返回14-29 = -15
。
您需要为compareTo(LocalDate)
实例的每个LocalDate字段调用Product
方法,并与LocalDate.now();
进行比较。当数字为负数时,打印有关产品的信息。
答案 1 :(得分:0)
当您尝试将toString
用作object
时,Java默认会调用String
方法,那么您需要做的就是准备Product
{{1 }}方法如下:
toString
此后,打印将很容易,但是您需要检查public String toString(){
return productId+", "+name+", "+unitPrice+", "+dateMdft;
}
,将date
操作为date
会花费很多。您可以找到here的String
日期最佳实践{p>
在您学会了如何使用java
Date
和如何检查日期之后,现在您需要编写所有在您拥有的数组上循环并检查日期和{{1 }}您的数据。
答案 2 :(得分:0)
首先,考虑字段的正确数据类型。您可以将String用于提交日期,但是如何比较这些日期?有强大的JDK datetime API,让我们使用它。我建议使用LocaDate,因为您只需要日期部分。
第二。您的构造函数不应为空或无用。您可以在构造函数中初始化对象字段。例如:
Product(String name) {
this(name, 0);
}
Product(String name, int unitPrice) {
this(name, unitPrice, LocalDate.now());
}
Product(String name, int unitPrice, LocalDate dateMdft) {
this.name = name;
this.unitPrice = unitPrice;
this.dateMdft = dateMdft;
}
下一步是对象的字符串表示方法。您可以覆盖toString或创建另一个。
private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM/dd/YYYY");
@Override
public String toString() {
return productId + "," + name + "," + unitPrice + "," + dateTimeFormatter.format(dateMdft);
}
最后,过滤并打印。
public static void main(String args[]) {
List<Product> products = new ArrayList<>();
products.add(new Product("1", 100, LocalDate.now().minusDays(1)));
products.add(new Product("2", 150, LocalDate.now().minusDays(2)));
products.add(new Product("3", 250, LocalDate.now()));
System.out.println("Via for loop:");
for (Product p: products) {
if (p.getDateMdft().isBefore(LocalDate.now())) {
System.out.println(p);
}
}
System.out.println("Via stream API:");
products
.stream()
.filter(p -> p.getDateMdft().isBefore(LocalDate.now()))
.forEach(System.out::println);
}