2014-11-07 4 views
6

Я создал простой класс предметов;Java ArrayList/RMI

class itemInfo{ 
     int auctionID; 
     int startPrice; 
     int buyoutPrice;   
} 

Я создал ArrayList;

ArrayList<itemInfo> itemSet = new ArrayList<itemInfo>(); 

У меня также есть метод здесь, что позволяет пользователю создать элемент (метод является неполным, я только пытался реализации выбора == 1 до сих пор!);

public void auctionChoice(){  

    System.out.println("---- What would you like to do? ----\n"); 
    System.out.println("1: List an item for auction\n"); 
    System.out.println("2: Bid on an existing item\n"); 
    System.out.println("3: Remove an item from the auction\n"); 

    if(scanner.next().equals("1")){ 

     itemInfo createdItem = new itemInfo(); 

     System.out.println("----Enter the auctionID----"); 
     createdItem.auctionID = scanner.nextInt(); 

     System.out.println("----Enter the item startPrice----"); 
     createdItem.startPrice = scanner.nextInt(); 

     System.out.println("----Enter the buyoutPrice----"); 
     createdItem.buyoutPrice = scanner.nextInt(); 

     System.out.println("Auction ID:" +createdItem.auctionID+ "\nstartPrice:" +createdItem.startPrice+ "\nbuyoutPrice:" +createdItem.buyoutPrice); 

     itemSet.add(createdItem); 
    } 
} 

То, что я застрял на строит метода, который позволит пользователю просматривать список текущих аукционов элементов, в основном способ распечатать НИКАКИЕ гарантии ArrayList.

Я изучил использование toString(), но я не уверен, как получить его, чтобы вернуть более одного значения, например, на аукционеID, startPrice, buyPrice.

В идеале я хотел бы, чтобы пользователь выбрал такой вариант, как «просмотр текущих аукционов», а затем метод печати всего массива ArrayList в формате «Идентификатор аукциона: **** Стартовая цена: **** Цена выкупа: **** ", очевидно, что это номер, который введен пользователем.

ответ

4

Как НИКАКИХ гарантий, является ArrayList объектов itemInfo, вы можете цикл через них, как это:

for(itemInfo info : itemSet){ 

    System.out.println(info.actionID); 
    System.out.println(info.auctionPrice); 
    System.out.println(info.buyoutPrice); 

} 

Это будет печатать их все. Возможно, по мере того, как вы включаете идентификатор, вы можете попросить пользователя ввести следующий идентификатор, а затем вы можете извлечь его из arraylist. Вы можете сделать это, пройдя через них все и сравнивая их ID с ID, введенным пользователем. Например:

// get the ID 
int auctionId = scanner.nextInt(); 
itemInfo selectedInfo; 

// find that item 
for(itemInfo info : itemSet){ 
    if(info.auctionId = auctionId){ 
     selectedInfo = info; 
     break; 
    } 
} 

if(selectedInfo == null){ 
    // the ID was not valid! 
    // do something to handle this case. 
} else { 
    System.out.println(selectedInfo.auctionID); 
    System.out.println(selectedInfo.auctionPrice); 
    System.out.println(selectedInfo.buyoutPrice); 
} 

Как вы изучаете, вот несколько вещей, чтобы сделать ваш код немного лучше:

1- Имена классов должны начинаться с заглавной буквы, вы должны изменить itemInfo к быть ItemInfo.

2- Вы должны как правило, используют методы получения и установки, поэтому вместо того, чтобы использовать selectedInfo.auctionID, вы должны использовать selectedInfo.getAuctionId() и selectedInfo.setAuctionId(x);

3- Вы, вероятно, следует рассматривать с помощью переключателя, а не если (scanner.next(). равен ("1")). Кроме того, если вы закончите писать else if (scanner.next(). Equals ("2")), то вы столкнетесь с проблемой, так как каждый раз, когда вызывается scanner.next(), он ожидает ввода, поэтому он ожидал бы ввод для каждого if. Вместо этого, вы должны иметь scanner.next() вне коммутатора, а затем использовать значение, которое читается в. Например:

int menuSelection = scanner.nextInt(); 
switch(menuSelection){ 
    case 1: 
     // do your stuff 
     break; 
    case 2: 
     // do something else 
     break; 
    default: 
     // handle any input which isn't a menu option 
} 

4- Наконец, вы, вероятно, следует разделить функциональные возможности для обработки каждого из эти параметры меню для разделения методов. Если вы поместите все это в этот метод, он будет очень быстрым и уродливым (трудно поддерживать) очень быстро.

+0

Рад, что это помогло, пожалуйста, прочитайте последний бит, который я добавил, как это поможет вам улучшить сделать код более легким в обслуживании и проще работать с в будущем. – ThePerson

+0

Это очень помогло, спасибо! Также спасибо за общие советы по моему коду, пытаясь быть как можно более изящными. Просто спросите с помощью метода case/switch, есть ли способ, который после того, как пользователь выбрал «1», ввел все переменные (auctionID и т. Д.), Код автоматически вернется к повторному выбору меню? Надеюсь, это имеет смысл. –

+0

Это имеет смысл. Возможно, вы захотите использовать цикл для этого. Подумайте о том, чтобы создать цикл для вызова метода methodChoice(). В зависимости от того, когда вы хотите остановиться, вам нужно выбрать соответствующий цикл из do, for или while. Например, я бы подумал, что вы можете добавить в свое меню вариант выхода. – ThePerson

0

Вы можете переопределить метод toString(), чтобы вернуть itemInfo с 3-х геттерами, чтобы вернуть 3 сохраненных vaules. Каждая vaule должна быть превращена в String, потому что getters возвратит ints.

2

Опираясь на ThePerson's ответ:

for(ItemInfo info : itemSet){ 
    System.out.println(info.actionID); 
    System.out.println(info.auctionPrice); 
    System.out.println(info.buyoutPrice); 
} 

Вы можете использовать ToString() на вашем itemInfo классе.

class ItemInfo{ 
    int auctionID; 
    int startPrice; 
    int buyoutPrice; 

    @Override 
    public String toString() { 
     StringBuilder sb = new StringBuilder(); 
     sb.append("Auction ID: "); 
     sb.append(auctionID); 
     sb.append("\nStart price: "); 
     sb.append(startPrice); 
     sb.append("\nBuyout price: "); 
     sb.append(buyoutPrice); 
     return sb.toString(); 
} 

то цикл становится

for(ItemInfo info : itemSet){ 
    System.out.println(info); 
}