Java 如何在ArrayList中合并两个相似的项?

Java 如何在ArrayList中合并两个相似的项?,java,arraylist,Java,Arraylist,所以,我有一个超类DessertItem。它有4个子类糖果,饼干,冰淇淋,圣代。圣代冰淇淋是冰淇淋的延伸。超类是一个抽象类。我还有一个独立的类,它不属于超类,而是以相同的包顺序。还有另一类——甜品店,主楼就在那里 Candy、Cookie类实现SameItem泛型类。通用接口SameItem类如下所示: public interface SameItem<T> { public boolean isSameAs(T other); } 和类似的东西,但是对于cookie类

所以,我有一个超类DessertItem。它有4个子类糖果,饼干,冰淇淋,圣代。圣代冰淇淋是冰淇淋的延伸。超类是一个抽象类。我还有一个独立的类,它不属于超类,而是以相同的包顺序。还有另一类——甜品店,主楼就在那里

Candy、Cookie类实现SameItem泛型类。通用接口SameItem类如下所示:

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;
}