2016-08-09 15 views
6

Tôi có một danh mục đầu tư cũng có danh sách liên kết của lớp Đầu tư (ví dụ: Google là một trường hợp đầu tư). danh sách) với dữ liệu cho mỗi giao dịch.Java - trả về một tham chiếu đến một địa điểm cụ thể trong danh sách liên kết với trình vòng lặp danh sách

Khi người dùng muốn thực hiện giao dịch (mua cổ phiếu google cho 5K), tôi cần tìm xem đầu tư (trong google) đã tồn tại trong investmentList chưa. Nếu nó không - thêm đầu tư mới (và thêm giao dịch cho lịch sử thương mại của nó), Nếu có - chỉ cần thêm một liên kết khác vào danh sách liên kết tradeHistory của google.

Sự cố - Tôi cần phương thức findInvestment để trả lại tham chiếu đến google (ví dụ đầu tư) từ portfolioList để tôi có thể cập nhật lịch sử giao dịch của mình. Phương thức trả về listIterator thay vì tham chiếu đến vị trí trong portfolioList (nên đầu tư Lớp học). Tôi nên sửa findInvestment như thế nào? (Found = ITER là sai)

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

Là giải pháp thay thế, bạn có thể sử dụng LinkedHashMap thay vì danh sách và sử dụng ký hiệu là "khóa", sau đó bạn sẽ không thực sự cần phải viết phương thức findInvenstment. .contains(), và .get() sẽ cung cấp cho bạn những gì bạn cần. – slambeth

+0

Vâng, đó là một lựa chọn tốt, cảm ơn. – Niminim

Trả lời

2

Bạn đã trả lời câu hỏi của bạn trong mã của bạn!

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

See?

Bạn đang gọi iter.next() cung cấp cho bạn chính xác những gì bạn đang tìm kiếm! Vì vậy, bạn đơn giản phải làm lại mã của bạn trong vòng lặp như:

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

Và trong tương lai: hãy đọc javadoc của lớp bạn đang xử lý. Họ thường cho bạn biết mọi thứ bạn cần biết! Gợi ý không. 2: không có điểm nào trong việc có println sau báo cáo trả lại.

Và tôi cảm thấy có xu hướng nói: có một số người có kinh nghiệm xem xét mã của bạn. Nó không phải là lỗi; nhưng có một số thứ có thể được cải thiện; giống như việc bạn sử dụng gấp đôi tiền tệ (luôn là một ý tưởng kinh doanh khủng khiếp); hoặc thực tế là "mô hình" của một khoản đầu tư ... nhét xuống một chuỗi biểu thị "biểu tượng" của nó. Đó là khủng khiếp "cấp thấp".

+0

Cuộc gọi thứ hai trên 'next()' sẽ phân phối một mục khác. –

+0

@MuratK. Lỗi của tôi; tôi đã bỏ lỡ phần đó. Cảm ơn cho những người đứng đầu lên; Tôi cập nhật câu trả lời m! – GhostCat

+0

@GhostCat chỉ là "bản nháp đầu tiên" trong phương thức addTrade mà tôi đã chuyển sang DecimalFormat.Lớp đầu tư có biểu tượng, số lượng cổ phiếu, giá trung bình và lịch sử thương mại, nó không quá đơn giản như một chuỗi. Cảm ơn!! – Niminim

2

Sử dụng nó như thế này

while (iter.hasNext()) { 

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

    } 
} 
+0

Giải thích downvote. –

3

Đơn giản chỉ cần giữ một Investment - hoặc trong java 8 Optional<Investment>

Thay vì danh sách liên kết:

private Map<String, Investment> investmentsBySymbol; 

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

Cũng BigDecimal là một lựa chọn tốt hơn so với đôi như

new BigDecimal("3.10"); 

có một độ chính xác của 2, và đôi là luôn luôn inprecise.

Các vấn đề liên quan