好的,所以我创建了扫描项目的机器的模拟。其中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;
}
}
答案 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,您还可以对代码进行以下修改:
如果您不进行此类更改,如果您从列表中删除元素,请不要忘记从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