2014-11-07 19 views
6

Ho creato una semplice classe di articoli;Java ArrayList/RMI

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

Ho creato un ArrayList;

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

Ho anche un metodo qui che consente a un utente di creare un elemento (il metodo è incompleta, ho provato solo attuazione scelta == 1 finora!);

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

Quello che sto bloccato su sta costruendo un metodo che permetterà all'utente di visualizzare un elenco di aste voce corrente, fondamentalmente un modo per stampare l'itemSet ArrayList.

Ho cercato di usare toString() ma non sono sicuro di come farlo restituire più di un valore, vale a dire auctionID, startPrice, buyoutPrice.

Idealmente vorrei che l'utente selezionasse una scelta come "visualizza aste correnti" e quindi il metodo per stampare l'intero ArrayList in un formato come "ID asta: **** Prezzo iniziale: **** Prezzo di acquisto: **** "con ovviamente il **** come numero immesso dall'utente.

risposta

4

Come set di elementi, è un ArrayList di oggetti ItemInfo, è possibile scorrere di loro in questo modo:

for(itemInfo info : itemSet){ 

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

} 

Questo li stamperà. Forse, come si include l'ID, è possibile chiedere all'utente di digitare l'ID successivo, e quindi è possibile recuperarlo dall'array. Puoi farlo collegandoli tutti e confrontando il loro ID con l'ID inserito dall'utente. Per esempio:

// 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); 
} 

Come si sta imparando, qui ci sono alcune cose per rendere il codice un po 'più bello:

1- nomi di classe dovrebbe iniziare con una maiuscola, si dovrebbe cambiare ItemInfo a essere ItemInfo.

2- Si dovrebbe in genere utilizzare getter e setter, quindi invece di utilizzare selectedInfo.auctionID, è necessario utilizzare selectedInfo.getAuctionId() e selectedInfo.setAuctionId(x);

3- Probabilmente si dovrebbe considerare l'utilizzo di uno switch piuttosto che il caso (scanner.next(). equals ("1")). Inoltre, se finisci di scrivere else if (scanner.next(). Equals ("2")) allora ti imbatterai in un problema, poiché ogni volta che scanner.next() viene chiamato, si aspetta l'input, quindi si aspetterebbe input per ogni if. Invece, si dovrebbe avere la scanner.next() al di fuori dello switch, e quindi utilizzare il valore che viene letto in. Ad esempio:

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- Infine, probabilmente si dovrebbe dividere la funzionalità per la gestione di ciascuna delle queste opzioni di menu in metodi separati. Se metti tutto in questo metodo diventerà molto grande e brutto (difficile da mantenere) molto veloce.

+0

Sono contento che questo ha aiutato, si prega di leggere l'ultimo pezzo che ho aggiunto in quanto vi aiuterà a migliorare rendere il codice più mantenibile e più facile da lavorare nel futuro. – ThePerson

+0

Ha aiutato così tanto, grazie! Grazie anche per i suggerimenti generali sul mio codice, cercando di essere il più elegante possibile. Solo per chiedere con il metodo case/switch, c'è un modo in cui dopo che un utente ha selezionato "1", immesso tutte le variabili (auctionID ecc.), Il codice tornerà automaticamente a dare nuovamente la scelta del menu? Spero che abbia un senso. –

+0

Questo ha senso. Probabilmente vuoi usare un loop per farlo. Prendi in considerazione l'idea di inserire un ciclo attorno alla chiamata a "methodChoice()". A seconda di quando vuoi fermarti, dovrai selezionare un ciclo appropriato tra do, for o while. Penserei, ad esempio, che si possa aggiungere al menu un'opzione per uscire. – ThePerson

0

È possibile eseguire l'override del metodo toString() per restituire itemInfo con 3 getter per restituire 3 vaules memorizzati. Ogni vaule deve essere trasformato in stringa perché i getter restituiranno valori int.

2

Sulla ThePerson's risposta:

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

È possibile utilizzare toString() sul ItemInfo classe.

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(); 
} 

poi il ciclo for diventa

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