如何删除java中最后输入的值?

时间:2016-03-21 07:41:35

标签: java

好的,所以我创建了扫描项目的机器的模拟。其中Machine是一个类,而Item是一个单独的类。我现在可以将物品设置为价格,然后让机器扫描它并将总价格和扫描的物品数量相加。删除最后扫描的项目最简单的方法是什么?是否需要涉及一个arraylist或类似的东西?顺便说一句我对java很新,所以任何帮助都会很棒!到目前为止,这是我的代码:

public class Machine
{
    // Both balance and count feilds below.
    private double balance;
    private int count;

    // This is the constructor method, it sets both the balance and count to 0.
    public Machine ()
    {
        balance = 0;
        count = 0;
    }

    // This simply returns the value of balance.
    public double getBalance ()
    {
        return balance;
    }

    // This simply returns the value of count.
    public int getItemCount ()
    {
        return count;
    }


    /* This simulates an item being scanned and is added to total item count,
     * as well as adding its price to the total balance.
     */
    public double scanItem (Item item)
    {
        balance = balance + item.price;
        count = count + 1;
        return item.price;
    }


    // This prints the receipt, showing the balance and total item count
    public void printReciept()
    {
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~");
        System.out.println("           --             ");
        System.out.println("           --             ");
        System.out.println("           --             ");
        System.out.println("           --             ");
        System.out.println("##########################");
        System.out.println("     Purchase summary     ");
        System.out.println(" ");
        System.out.println("   Total balance: $" + balance + "  "); 
        System.out.println("Total item count: " + count + " items");
        System.out.println(" " );
        System.out.println("  Thank you for shopping  ");
        System.out.println("         with us!         ");
        System.out.println("##########################");
        System.out.println("           --             ");
        System.out.println("           --             ");
        System.out.println("           --             ");
        System.out.println("           --             ");
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~");

        balance = 0;
        count = 0;
    }    

    // This method clears the balance and count
    public void clearAll()
    {
        balance = 0;
        count = 0;
    }
}

和我的Item类:

public class Item
{
    public double price;

    public Item(double paramPrice)
    {
        price = paramPrice;
    }

    public double getPrice()
    {
        return price;
    }
}

8 个答案:

答案 0 :(得分:3)

只是给你一些示例代码(npinti给出了正确的答案,我不会删除余额计算,当你计算它时表现更好 - 只有你的篮子里有很多物品才会真正重要)

private List<Item> items = new ArrayList<>();

public double scanItem (Item item) {
    balance = balance + item.price;
    items.add(item);
    return item.getPrice();
}

public int getItemCount () {
    return items.size();
}

public void removeLastItem() {
  if (items.size() == 0) {
      return;
  }

  Item item = items.remove(items.size() - 1);
  balance -= item.price;
}

public void clearAll() {
    balance = 0.0;
    items.clear();
}  

关于您的Item代码的一些信息。您创建了价格属性public并提供了一个getter。通常,您应该将属性的可见性更改为private,并使用getter方法。

答案 1 :(得分:1)

是的,你需要使用某种集合。最简单的方法是使用ArrayList<Item>来跟踪要添加的内容。

使用ArrayLists,元素会添加到列表的末尾,因此,如果要删除最后添加的项目,只需删除列表的尾部即可。

通过ArrayList,您还可以对代码进行以下修改:

  1. 可以从全局字段中删除余额。当您要求余额时,您只需迭代并计算总数。
  2. 也可以删除Count,并返回数组列表的大小。
  3. 如果您不进行此类更改,如果您从列表中删除元素,请不要忘记从Count中扣除1。

答案 2 :(得分:1)

您可以使用已订购LIFO的堆栈(后进先出),您需要的只是lastItem = stack.pop(),然后从余额中减去该项目的值。

答案 3 :(得分:1)

要删除最后添加的项目(“已扫描”),您需要记住该项目。或者至少记住它的价格。

如果要求严格“能够删除最后添加的项目”,则将实例变量添加到Machine类,称为lastItemScanned。在scanItem方法中添加一行:

this.lastItemScanned = item;

在删除最后一项的方法中,首先检查lastItemScanned是否为空。如果没有,请递减计数,减少总数,并将lastItemScanned设置为空。

更实际的可能是记住所有添加的项目。为此,您需要一个称为集合的数据结构。有许多种类的收藏品各有优势和权衡。 List确实可能适合作为接口,ArrayList可能是具体实现的好选择。刚出现的另一个答案可能表明了这一点。您还可以在Stack Overflow上找到许多示例。

只有在Machine对象需要的整个时间内,对象没有以任何显着的方式改变(“变异”)时,使用和存储传递的Item对象才有意义。

顺便说一下,你的班级在不是线程安全方面存在严重问题。但是,对于介绍性编程练习,可以忽略这一点。

答案 4 :(得分:1)

吉日是对的。集合有一些优点(比如能够在收据上打印物品),但是对于这个特殊要求,没有必要。

public class Machine
{
    // Both balance and count feilds below.
    private double balance;
    private int count;
    private Item lastItem;

    // This is the constructor method, it sets both the balance and count to 0.
    public Machine ()
    {
        balance = 0;
        count = 0;
        lastItem = null;
    }

    // getBalance and getItemCount as before

    /* This simulates an item being scanned and is added to total item count,
     * as well as adding its price to the total balance.
     */
    public double scanItem (Item item)
    {
        balance = balance + item.price;
        count = count + 1;
        lastItem = item;
        return item.price;
    }

    /** This deletes the last value entered */
    public boolean deleteLastItem() {
        if (lastItem == null) {
            return false;
        } else {
            balance = balance - lastItem.price;
            count = count - 1;
            lastItem = null;
            return true;
        }
    }

    // This prints the receipt, showing the balance and total item count
    public void printReciept()
    {
        // as before

        balance = 0;
        count = 0;
        lastItem = null;
    }    

    // This method clears the balance and count
    public void clearAll()
    {
        balance = 0;
        count = 0;
        lastItem = null;
    }
}

答案 5 :(得分:0)

您可以使用ArrayList的.remove(index)方法删除最后一个元素。只需将index变量替换为size of list - 1

即可

答案 6 :(得分:0)

如果您只需要删除最后一项(而且绝不是最后两项等),只需存储最后一个价格(或最后一次Item)。

如果您选择此方法,请确保添加一些防御以防止删除最后一项(例如,在删除最后一项之前检查null,然后在删除后将最后一项设置为null

答案 7 :(得分:0)

使用堆栈的概念。由于堆叠是LIFO订购的(后进先出),您可以使用stack.pop()弹出最后一项,并从&#39;余额&#39;中减去它。

有关堆栈的详细信息,请参阅此处: https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html