2016-03-21 2 views
2

Итак, я создал симуляцию сканирования машины. Где Machine - класс, а Item - отдельный класс. В настоящее время я могу установить товар по цене, а затем сканировать его и добавить общую цену, а также количество проверенных элементов. Какой самый простой способ удалить последний отсканированный элемент? Нужно ли включать в себя аррайалиста или что-то в этом роде? 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>, чтобы отслеживать, что добавляется.

Использование ArrayLists Элементы добавляются в конце списка, поэтому, если вы хотите удалить последний добавленный элемент, вы можете просто удалить хвост списка.

Через ArrayList Вы можете также внести следующие изменения в код:

  1. Баланс может быть удален из глобальной области. Когда вы запрашиваете баланс, вы просто перебираете и вычисляете общее количество.
  2. Счет также может быть удален, и вы вернете размер списка массивов.

Если вы не внесете такие изменения, не забудьте вычесть 1 из графа, если вы удалите элементы из списка.

0

Вы можете использовать метод ArrayList .remove(index), чтобы удалить последний элемент. Просто замените index переменную size of list - 1

0

Если вы только когда необходимо удалить последний элемент (и никогда две последние детали и т.д.), достаточно хранить только последнюю цену (или последний Item).

Если вы выбираете этот подход, убедитесь, чтобы добавить некоторые защиты от удаления последнего элемента дважды (например, проверить null перед удалением последнего элемента, затем установите последний элемент в null после удаления).

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. Добавить в свой метод scanItem:

this.lastItemScanned = item; 

В вашем методе, чтобы удалить последний элемент, сначала проверьте, чтобы увидеть, если lastItemScanned является недействительным. Если нет, уменьшите свой счет, уменьшите общее число и установите lastItemScanned на null.

Более практичный, вероятно, будет помнить все добавленные предметы. Для этого вам нужна структура данных, известная как коллекция. Существует множество коллекций, каждый из которых имеет преимущества и компромиссы. A List действительно, вероятно, подходит как интерфейс, а ArrayList, вероятно, является хорошим выбором в качестве конкретной реализации. Другой ответ, который только что появился, может показать это. Вы также можете найти множество примеров переполнения стека.

Использование и сохранение переданного объекта объекта имеет смысл только в том случае, если объект не изменяется («мутирует») каким-либо значимым образом за все время, которое требуется для объекта «Машина».

Кстати, у вашего класса серьезные проблемы с точки зрения небезопасности потоков. Но это может быть проигнорировано для вводного программирования.

1

Jiri правильный. В коллекции есть некоторые преимущества (например, возможность распечатывать элементы на квитанции), но для этого конкретного требования нет необходимости.

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() и вычесть его из баланса.

Смотрите здесь подробности о стеке: https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html

Смежные вопросы