2016-08-09 145 views
6

Ich habe eine Portfolio-Klasse, die auch eine verknüpfte Liste der Investment-Klasse hat (Beispiel - Google ist eine Instanz der Investition), jede Investition hat eine Handelsgeschichte (eine andere verknüpft Liste) mit Daten für jeden Handel.Java - geben Sie einen Verweis auf eine bestimmte Stelle in einer Linkedlist mit Liste Iterator

Wenn der Benutzer einen Trade machen will (kaufen Sie Google-Aktien für 5K) Ich muss herausfinden, ob die Investition (in Google) bereits in der Investmentliste vorhanden ist. Wenn dies nicht der Fall ist - fügen Sie eine neue Investition hinzu (und fügen Sie den Trade für seine Handelshistorie hinzu), falls dies der Fall ist - fügen Sie einfach einen weiteren Link zur verknüpften Liste von Google TradeHistory hinzu.

Das Problem - Ich brauche findInvestment-Methode, um einen Verweis auf google (Investment-Instanz) aus der investmentList zurückzugeben, damit ich seine Handelshistorie aktualisieren kann. Die Methode gibt einen listIterator anstelle einer Referenz auf einen Speicherort in investmentList (sollte Investition sein Klasse). Wie korrigiere ich findInvestment? (Gefunden = iter ist falsch)

public class Portfolio { 


private LinkedList<Investment> investmentsList; 

public Portfolio() { 
    investmentsList = new LinkedList<Investment>(); 
} 

public void addInvestment(String symbol, double money){ 

    Investment invest = findInvestment(symbol); 
    if (invest == null) { 
     System.out.println("symbol does not exist"); 
     getInvestmentsList().add(new Investment(symbol,money)); 
     System.out.println("New invetment has been added to your portfolio - " +symbol); 
    } else { 
     invest.addTrade(symbol,money); 
     System.out.println("A new trade has been added to the current investment - " + symbol); 

    } 
} 

public Investment findInvestment(String symbol){ 

    Investment found = null; 
    ListIterator<Investment> iter = investmentsList.listIterator(); 


    while (iter.hasNext()) { 

     if (iter.next().getSymbol().equals(symbol)) { 
      found = iter; 
      return found; 
      System.out.println("Found the symbol"); 
     } 
    } 

    return found; 
} 
+1

Als eine alternative Lösung könnten Sie eine LinkedHashMap anstelle einer Liste verwenden und Symbol als "Schlüssel" verwenden, dann müssten Sie nicht wirklich die findInventsment-Methode schreiben. .contains() und .get() liefern Ihnen, was Sie brauchen. – slambeth

+0

Ja, es ist eine gute Alternative, danke. – Niminim

Antwort

2

Sie bereits beantwortet Ihre Frage in Ihrem Code!

if (iter.next().getSymbol().equals(symbol)) { 
     found = iter; 

Sehen?

Sie rufen iter.next() auf, was genau das ergibt, wonach Sie suchen! Also, Sie einfach haben Sie den Code innerhalb der Schleife zu überarbeiten wie:

Investment currentInvestment = iter.next(); 
if (currentInvestment.get...) { 
    found = currentInvestment; 
    println... 
    return found; 
} 

Und für die Zukunft: Sie lesen mit der javadoc der Klassen, die Sie beschäftigen. Sie sagen normalerweise alles, was Sie wissen müssen! Hinweis Nr. 2: Es hat keinen Sinn, einen Ausdruck zu haben nach die Rückkehr Erklärung.

Und ich fühle mich geneigt zu sagen: haben einige erfahrene Leute Ihren Code überprüfen. Es ist nicht fehlerhaft; aber es gibt einige Dinge, die verbessert werden könnten; wie Ihre Verwendung von Doppel für Währung (die immer eine schreckliche Idee ist); oder die Tatsache, dass Ihr "Modell" einer Investition ... auf eine Zeichenkette läuft, die sein "Symbol" bezeichnet. Das ist schrecklich "Low-Level".

+0

Der zweite Aufruf von 'next()' liefert ein anderes Element. –

+0

@MuratK. Mein Fehler; Ich habe diesen Teil verpasst. Danke für die Köpfe hoch; Ich habe meine Antwort aktualisiert! – GhostCat

+0

@GhostCat es ist nur ein "erster Entwurf" in addTrade-Methode wechselte ich zu DecimalFormat.Anlageklasse hat Symbol, Anzahl der Aktien, Durchschnittspreis und Handelsgeschichte, es ist nicht so einfach wie eine Zeichenfolge. Vielen Dank!! – Niminim

2

Verwenden Sie es wie folgt

while (iter.hasNext()) { 

    if ((found = iter.next()).getSymbol().equals(symbol)) { 
     System.out.println("Found the symbol"); 
     return found; 

    } 
} 
+0

Erklären Sie downvote. –

3

Halten Sie einfach ein Investment - oder in Java 8 Optional<Investment>

Statt der verknüpften Liste:

private Map<String, Investment> investmentsBySymbol; 

public Investment findInvestment(String symbol){ 
    Investment found = investmentsList.get(symbol); 
    return found; 
} 

Auch BigDecimal ist eine bessere Wahl als das Doppelte als

new BigDecimal("3.10"); 

eine Genauigkeit hat von 2 und Doppel sind immer unpräzise.