2016-03-21 4 views
2

私はアイテムをスキャンするマシンのシミュレーションを作成しました。 MachineはクラスでItemは別のクラスです。私は現在、アイテムを価格に設定してから、マシンにそれをスキャンさせ、合計価格とスキャンしたアイテムの数を合計させることができます。最後にスキャンしたアイテムを削除する最も簡単な方法は何ですか?それはarraylistまたはそれのようなものを含める必要がありますか? Btw私は非常にjavaに新しいですので、どんな助けも素晴らしいでしょう!ここに私のコードは、これまでのところです: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

リストを使用し、トップ、ニーズに応じて、それを管理する...追加、deleteat(...)など –

答えて

1

はい、あなたは、コレクションのいくつかの並べ替えを使用する必要があります。最も簡単なのは、追加する内容を追跡するためにArrayList<Item>を使用することです。

ArrayListを使用すると、要素がリストの末尾に追加されます。最後に追加した要素を削除する場合は、リストの末尾を削除するだけです。また、あなたのコードに次の変更を行うことができArrayListを通じ

  1. バランスがグローバルフィールドから除去することができました。残高を求めるときは、単純に合計を繰り返し計算します。
  2. Countを削除して、配列リストのサイズを返すこともできます。

このような変更を加えない場合は、リストから要素を削除する場合は、Countから1を差し引いてください。

0

最後の要素を削除するには、.remove(index) ArrayListメソッドを使用できます。あなただけの今までに最後の項目(決して2最後のアイテムなど)を削除する必要がある場合だけsize of list - 1

0

index変数を置き換え、それだけで、最後の価格(または最後Item)を格納するのに十分です。

あなたがこのアプローチを選択した場合、(例えば削除後nullに最後の項目を設定し、その後、最後の項目を削除する前にnullをチェック)を2回、最後の項目を削除することに対して、いくつかの防御を追加してください。

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を作成し、ゲッターを提供しました。一般的には、属性の可視性をprivateに変更し、getterメソッドを使用するだけです。

1

LIFO注文(先入れ先出し)のスタックを使用することができ、必要なのはlastItem = stack.pop()で、その商品の値を残高から引きます。

1

最後に追加したアイテム(「スキャン済み」)を削除するには、そのアイテムを覚えておく必要があります。または少なくともその価格を覚えている。

厳密に「最後に追加された項目を削除できる」必要がある場合は、lastItemScannedという名前のMachineクラスにインスタンス変数を追加します。最後の項目を削除するためにあなたの方法では

this.lastItemScanned = item; 

lastItemScannedがnullであるかどうかを確認するには、最初のチェック:あなたのscanItem方法に行を追加します。そうでない場合は、カウントを減らして合計を減らし、lastItemScannedをnullに設定します。

さらに実際的には、追加されたすべてのアイテムを覚えている可能性があります。そのためには、コレクションと呼ばれるデータ構造が必要です。利点とトレードオフを持つコレクションには多くの種類があります。 Listは実際にはおそらくインターフェイスとして適切であり、ArrayListはおそらく具体的な実装としては良い選択です。ちょうど現れたもう1つの答えはそれを示すかもしれません。スタックオーバーフローで多くの例が見つかります。オブジェクトは、マシンオブジェクトは、それを必要とする全ての時間の間、任意の重要な方法で(「変異」)変更されていない場合、渡されたアイテムのオブジェクトを使用して格納

にのみ意味があります。

ところで、クラスにはスレッドセーフではないという深刻な問題があります。しかし、これは初歩的なプログラミングの練習では無視できます。

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

スタックの概念を使用します。スタックはLIFOで注文されているので(先入れ先出し)、stack.pop()を使用して最後の項目をポップアウトし、 'balance'から引きます。

スタックに関する詳細はこちらをご覧ください: https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html

関連する問題