2016-08-09 2 views
6

투자 클래스의 링크 목록도있는 포트폴리오 클래스가 있습니다 (예 : Google이 투자의 인스턴스 임), 각 투자에는 목록)을 각 거래에 대한 데이터와 비교합니다.Java - 목록 반복기가있는 연결된 목록의 특정 위치에 대한 참조를 반환합니다.

사용자가 (5K에 대해 Google 주식을 구입) 거래를하고 싶을 때 Google에서 투자가 investmentList에 이미 있는지 찾아야합니다. 그렇지 않으면 - 새로운 투자를 추가하고 (그것의 무역 역사를 위해 무역을 추가하십시오), 그것이하는 경우에 - Google의 tradeHistory 연결 목록에 다만 다른 연결을 추가하십시오.

문제가 - investList에서 google (투자 인스턴스)에 대한 참조를 반환하려면 findInvestment 메서드가 필요합니다. 그래서 trade 履歴를 업데이트 할 수 있습니다. 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을 사용하고 symbol을 "키"로 사용하면 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()'의 두 번째 호출은 다른 항목을 전달합니다. –

+0

@ MuratK. 내 잘못이야; 나는 그 부분을 놓쳤다. 머리를 가져 주셔서 감사합니다. 나는 대답을 업데이트했다! – GhostCat

+0

@GhostCat addTrade 메소드의 "최초 초안"입니다. DecimalFormat으로 전환했습니다.투자 클래스는 기호, 주식수, 평균 가격 및 거래 내역을 가지고 있습니다. 한 줄로 너무 간단하지 않습니다. 감사!! – Niminim

2

while (iter.hasNext()) { 

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

    } 
} 
+0

설명 downvote. –

3

단순히 Investment 개최 - 또는 자바 대신에 링크 된 목록의 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, 복식은 항상 비현실적입니다.

관련 문제