2016-08-09 9 views
6

投資クラスのリンクリストも持つPortfolioクラスを持っています(例:Googleは投資のインスタンスです)、各投資はリスト)を各取引のデータと比較します。Java - リストイテレータでリンクリスト内の特定の場所への参照を返します

ユーザーがトレードをしたい場合(Googleの株式を5Kで購入する場合)、investment(Googleでの投資)がinvestmentListに既に存在するかどうかを調べる必要があります。そうでない場合は、新しい投資を追加し(そしてその貿易履歴の取引を追加する)、そうであれば、GoogleのtradeHistoryリンクリストに別のリンクを追加するだけです。

問題点 - investmentListからgoogle(投資インスタンス)への参照を返すためにfindInvestmentメソッドが必要です。そのため、私はその貿易履歴を更新できます。このメソッドはinvestmentListの場所への参照ではなくlistIteratorを返しますクラス)。どのようにfindInvestmentを修正する必要がありますか?

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

代わりに、リストではなくLinkedHashMapを使用し、シンボルを「キー」として使用すると、findInvenstmentメソッドを書く必要はありません。 .contains()、.get()は必要なものを提供します。 – slambeth

+0

ええ、それはいい代案です、ありがとう。 – Niminim

答えて

2

あなたはすでにあなたのコード内であなたの質問に答え、このようにそれを使用します(発見= ITERは間違っています)!

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

を参照してください。

iter.next()を呼び出すと、探しているものが正確に表示されます。だから、簡単なあなたのようなループ内であなたのコードを手直しする必要があります。

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

と将来のために:あなたが扱っているクラスのJavadocを読んでください。彼らは通常あなたが知る必要があるすべてを教えてくれます!ヒントはありません。 2:のreturn文の後にprintlnを持つことに意味がない

私は、言いたいことがあります。経験豊富な人にあなたのコードをレビューさせるようにしてください。それはバグではありません。改善できるものがかなりあります。通貨のためのダブルのあなたの使用のような(これは常に恐ろしいアイデアです);投資の "モデル"がその "記号"を表す文字列になっているという事実があります。それはひどく「低レベル」です。

+0

'next()'の2回目の呼び出しは、別のアイテムを配信します。 –

+0

@ MuratK。私の悪い;私はその部分を逃した。ヘッドアップをありがとう;私は答えを更新しました! – GhostCat

+0

@GhostCat addTradeメソッドのちょうど "最初の草案" DecimalFormatに切り替えました。投資クラスにはシンボル、株式数、平均価格、貿易履歴がありますが、1つの文字列として単純すぎるわけではありません。ありがとう!! – Niminim

2

while (iter.hasNext()) { 

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

    } 
} 
+0

説明downvote。 –

3

は単にInvestment開催 - またはJavaで代わりにリンクされたリストの8 Optional<Investment>

private Map<String, Investment> investmentsBySymbol; 

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

またBigDecimalのは精度を持つダブル

new BigDecimal("3.10"); 

としてより良い選択であります2の倍数で、倍数は常に不正確です。

関連する問題