Java - 使用列表迭代器返回对链表中特定位置的引用

时间:2016-08-09 14:57:07

标签: java data-structures iterator

我有一个投资组合类,也有投资类的链表(例如 - 谷歌是投资的一个实例),每个投资都有一个交易历史(另一个链表),每个交易的数据。

当用户想要进行交易(以5K购买谷歌股票)时,我需要查看投资(在Google中)是否已经存在于投资列表中。如果没有 - 添加新的投资(并为其交易历史添加交易),如果确实如此 - 只需添加另一个链接到谷歌的tradeHistory链表。

问题 - 我需要findInvestment方法从投资列表返回对谷歌(投资实例)的引用,以便我可以更新其交易历史。该方法返回一个listIterator而不是对investmentList中某个位置的引用(应该是投资类) )。我该如何纠正findInvestment? (发现= iter错了)

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

3 个答案:

答案 0 :(得分: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,双精度始终不准确。

答案 1 :(得分:2)

像这样使用

 while (iter.hasNext()) {

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

    }
}

答案 2 :(得分:2)

您已在代码中回答了问题!

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

请参阅?

您正在调用iter.next(),它可以为您提供所需内容!所以,你必须在循环中重新编写代码,如:

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

对于未来:请阅读您正在处理的课程的javadoc。他们通常会告诉您需要知道的一切!提示没有。 2:在返回语句之后有一个println 没有意义。

我倾向于说:让一些有经验的人审核您的代码。它不是马车;但是有一些事情可以改进;比如你使用double for currency(这总是一个可怕的想法);或者你的投资“模型”的事实......归结为表示其“符号”的字符串。这非常“低级”。