Java 如何在ArrayList中合并两个相似的项?
所以,我有一个超类DessertItem。它有4个子类糖果,饼干,冰淇淋,圣代。圣代冰淇淋是冰淇淋的延伸。超类是一个抽象类。我还有一个独立的类,它不属于超类,而是以相同的包顺序。还有另一类——甜品店,主楼就在那里 Candy、Cookie类实现SameItem泛型类。通用接口SameItem类如下所示:Java 如何在ArrayList中合并两个相似的项?,java,arraylist,Java,Arraylist,所以,我有一个超类DessertItem。它有4个子类糖果,饼干,冰淇淋,圣代。圣代冰淇淋是冰淇淋的延伸。超类是一个抽象类。我还有一个独立的类,它不属于超类,而是以相同的包顺序。还有另一类——甜品店,主楼就在那里 Candy、Cookie类实现SameItem泛型类。通用接口SameItem类如下所示: public interface SameItem<T> { public boolean isSameAs(T other); } 和类似的东西,但是对于cookie类
public interface SameItem<T> {
public boolean isSameAs(T other);
}
和类似的东西,但是对于cookie类
所有子类都有以下方法:
默认构造函数
public Cookie(String n, int q, double p) {
super(n);
super.setPackaging("Box");
cookieQty = q;
pricePerDozen = p;
}
public int getCookieQty() {
return cookieQty;
}
public double getPricePerDozen() {
return pricePerDozen;
}
public void setCookieQty(int q) {
cookieQty = q;
}
public void setToppingPricePricePerDozen(double p) {
pricePerDozen = p;
}
@Override
public double calculateCost() {
double cookieCost = cookieQty * (pricePerDozen/12);
return cookieCost;
}
和toString()方法
所以,我的程序做的是从用户那里获取输入,询问甜点的名称,询问数量,或者根据甜点的数量,询问单价。询问付款方式。然后打印收据。下面是Order类的外观:
import java.util.ArrayList;
import java.util.List;
public class Order extends implements Payable{
//attributes
PayType payMethod;
private ArrayList<DessertItem> OrderArray;
//Constructor
public Order() {
OrderArray = new ArrayList<>();
payMethod = PayType.CASH;
}
//methods
public ArrayList<DessertItem> getOrderList(){
return OrderArray;
}// end of getOrderList
public ArrayList<DessertItem> Add(DessertItem addDesert){
enter code here
OrderArray.add(addDesert);
/* for(DessertItem i : getOrderList()) {
if(i instanceof Candy) {
for(DessertItem j : getOrderList()) {
if(j instanceof Candy) {
if(((Candy) i).isSameAs((Candy) j)) {
*/
//this is what I have tried so far, but I am lost
}
}
}
} else if(i instanceof Cookie) {
for (DessertItem j : getOrderList()) {
if(((Cookie) i).isSameAs((Cookie)j)) {
OrderArray.add(j);
} else {
OrderArray.add(i);
}
}
}
}
return OrderArray;
}// end of Add
public int itemCount(){
int counted = OrderArray.size();
return counted;
}//end of itemCount
public double orderCost() {
double orderResult = 0;
for(int i=0; i<OrderArray.size(); i++) {
orderResult = orderResult + OrderArray.get(i).calculateCost();
}
return orderResult;
}
public double orderTax() {
double taxResult = 0;
for(int i = 0; i<OrderArray.size(); i++) {
taxResult = taxResult + OrderArray.get(i).calculateTax();
}
return taxResult;
}
public double orderTotal() {
double ordertotal = orderTax() + orderCost();
return ordertotal;
}
@Override
public PayType getType() {
// TODO Auto-generated method stub
return payMethod;
}
@Override
public void setPayType(PayType p) {
payMethod = p;
}
public String toString() {
String finalOutput = "";
finalOutput += "------------------------Receipt--------------------------\n";
for(int i = 0; i < OrderArray.size(); i++) {
finalOutput = finalOutput + OrderArray.get(i).toString();
}
finalOutput += "--------------------------------------------------\n";
String line2 = "Total Number of items in order: " + itemCount() + "\n";
String line3 = String.format("Order Subtotals:\t\t\t\t $%-6.2f", orderCost());
String line4 = String.format("[Tax: $%.2f]\n", orderTax());
String line5 = String.format("\nOrder Total:\t\t\t\t\t $%-6.2f\n", orderTotal());
String outputVar = String.format("%s\n%s%s%17s", line2, line3, line4, line5);
String ending = "----------------------------------------------------";
String payType = String.format("\nPaid for with: %s", payMethod.name());
return finalOutput + outputVar + ending + payType;
}
import java.util.ArrayList;
导入java.util.List;
公共课堂秩序{
//属性
付费方式;
私有ArrayList OrderArray;
//建造师
公共秩序(){
OrderArray=newArrayList();
payMethod=PayType.CASH;
}
//方法
公共ArrayList getOrderList(){
返回顺序数组;
}//getOrderList结束
公共阵列列表添加(DessertItem addDesert){
在这里输入代码
添加(addDesert);
/*对于(DessertItem i:getOrderList()){
如果(i糖果实例){
对于(DessertItem j:getOrderList()){
if(糖果的j实例){
如果((糖果)i.isSameAs((糖果)j)){
*/
//这是我到目前为止尝试过的,但我迷路了
}
}
}
}else if(我是Cookie的实例){
对于(DessertItem j:getOrderList()){
如果((Cookie)i.isSameAs((Cookie)j)){
OrderArray.add(j);
}否则{
添加(i);
}
}
}
}
返回顺序数组;
}//添加结束
公共int itemCount(){
int counted=OrderArray.size();
返回计数;
}//项目结束计数
公共双订单成本(){
double orderResult=0;
对于(int i=0;i您是否应该检查添加到订单中的重复项目?这会很奇怪,我不知道有哪家餐厅不允许您从菜单中两次订购相同的项目。为什么订单类会扩展沙漠项目?是为了让您可以将一个订单添加到另一个吗?如果是这样的话,这是一种代码味道。您知道吗相反,应该有一个方法专门接受一个Order
实例,类似于public Order addOrder(Order other){…}
并确保检查是否other==this
。等等,你只是想检查两种甜点是否相等?为什么不实现hashcode和equals?@JonnyHenly,它没有在我的原始代码中扩展它。我只是出于绝望尝试了一切,只是试图扩展它,看看这是否有帮助。我忘了删除在复制粘贴我的代码之前删除这部分。它们不是两个不同的订单。我正在尝试将两个类似的项目与ArrayList合并。我知道它们是相似的,但如何合并它们?就像我以2美元的价格订购2磅糖果。然后我记得我还需要1磅相同的糖果。我向sa订购剩余的1磅me order。我如何在收据中合并这些项目?你不必这样做。如果你听从我的建议,覆盖hashcode和equals,你可以使用一个容器,它不允许像集合一样重复,然后在处理后将其转换为列表。你意识到你的SameItem接口基本上是在重新发明轮子,对吗?
import java.util.ArrayList;
import java.util.List;
public class Order extends implements Payable{
//attributes
PayType payMethod;
private ArrayList<DessertItem> OrderArray;
//Constructor
public Order() {
OrderArray = new ArrayList<>();
payMethod = PayType.CASH;
}
//methods
public ArrayList<DessertItem> getOrderList(){
return OrderArray;
}// end of getOrderList
public ArrayList<DessertItem> Add(DessertItem addDesert){
enter code here
OrderArray.add(addDesert);
/* for(DessertItem i : getOrderList()) {
if(i instanceof Candy) {
for(DessertItem j : getOrderList()) {
if(j instanceof Candy) {
if(((Candy) i).isSameAs((Candy) j)) {
*/
//this is what I have tried so far, but I am lost
}
}
}
} else if(i instanceof Cookie) {
for (DessertItem j : getOrderList()) {
if(((Cookie) i).isSameAs((Cookie)j)) {
OrderArray.add(j);
} else {
OrderArray.add(i);
}
}
}
}
return OrderArray;
}// end of Add
public int itemCount(){
int counted = OrderArray.size();
return counted;
}//end of itemCount
public double orderCost() {
double orderResult = 0;
for(int i=0; i<OrderArray.size(); i++) {
orderResult = orderResult + OrderArray.get(i).calculateCost();
}
return orderResult;
}
public double orderTax() {
double taxResult = 0;
for(int i = 0; i<OrderArray.size(); i++) {
taxResult = taxResult + OrderArray.get(i).calculateTax();
}
return taxResult;
}
public double orderTotal() {
double ordertotal = orderTax() + orderCost();
return ordertotal;
}
@Override
public PayType getType() {
// TODO Auto-generated method stub
return payMethod;
}
@Override
public void setPayType(PayType p) {
payMethod = p;
}
public String toString() {
String finalOutput = "";
finalOutput += "------------------------Receipt--------------------------\n";
for(int i = 0; i < OrderArray.size(); i++) {
finalOutput = finalOutput + OrderArray.get(i).toString();
}
finalOutput += "--------------------------------------------------\n";
String line2 = "Total Number of items in order: " + itemCount() + "\n";
String line3 = String.format("Order Subtotals:\t\t\t\t $%-6.2f", orderCost());
String line4 = String.format("[Tax: $%.2f]\n", orderTax());
String line5 = String.format("\nOrder Total:\t\t\t\t\t $%-6.2f\n", orderTotal());
String outputVar = String.format("%s\n%s%s%17s", line2, line3, line4, line5);
String ending = "----------------------------------------------------";
String payType = String.format("\nPaid for with: %s", payMethod.name());
return finalOutput + outputVar + ending + payType;
}