我的2D ArrayList输出给出了累积值?

时间:2016-09-15 23:25:39

标签: java arraylist

我需要一些帮助。这里的实际情况是,程序I代码将读取几个文本文档,每个文本文档具有不同的单词数。我想将这些单词保存到2D ArrayList中,因为它根据当前存在的文本文档数和每个文本文档中的单词计数提供动态大小。

但是,经过多次测试后,给出的输出并不像我预期的那样。为了简化操作,我将此示例代码作为参考。我如何使用2D ArrayList与我在实际Case中使用的相同。

    ArrayList<List<String>> twoDWords = new ArrayList<List<String>>();
    List<String> oneDword = new ArrayList<String>();

    String word = "";
    String[] words = new String[5];

    System.out.println("Want like these(Using 2D ArrayList):");
    for(int i = 0; i< 5; i++)
    {
        System.out.print("Array - "+i +": ");
        word += "myArray ";
        words[i] = word;
        System.out.println(word);
    }

    System.out.println("\nBut Get these output:");
    for(int i = 0; i< 5; i++)
    {
        oneDword.add(words[i]);
        twoDWords.add(oneDword);
        //oneDword.clear();
    }

    for(int i = 0; i< twoDWords.size(); i++)
    {
        System.out.print("Array - "+i +": ");
        for(int j = 0; j< twoDWords.get(i).size(); j++)
        {
            System.out.print(twoDWords.get(i).get(j)+" ");
        }
        System.out.println("");
    }

这是输出: enter image description here

输出看起来只是重复地给出最新的累积值。正如您在代码中看到的那样,我也尝试使用clear()方法重置数组,但它会给出空值。

我希望有人可以帮我解决这个问题。提前谢谢〜

3 个答案:

答案 0 :(得分:1)

这是一个完全相同的数组对象,存储在数组twoDwords的每个元素中。您需要在循环内使用“new”为数组twoDWords的每个元素创建一个新数组:

   ..........
    for(int i = 0; i< 5; i++)
        {   oneDword = new ArrayList<String>(); //<-------
            oneDword.add(words[i]);
            twoDWords.add(oneDword);
            //oneDword.clear();
        }
    .........

答案 1 :(得分:1)

添加到Christopher解决方案,您将使用foreach循环,因为它更容易阅读:

for(int i = 0; i< 5; i++)
{
    oneDword.add(words[i]);
    twoDWords.add(oneDword);
    oneDword = new ArrayList<String>(); // --> You need this since 'oneDword' contains the previous values as well and it'll keep adding new values to this list.
    //oneDword.clear();
}

for(List<String> al: twoDWords) {
  for(String s: al) {
    System.out.println(s);
  }
}

答案 2 :(得分:1)

要了解你做错了什么,你需要考虑方法参数引用。 特别是这一行:

    public double calculateTaxes()
{
    double tax;
    if ((stateCode.equals("TX")) && getSquareFeet() > 1500)
        tax = getMarketValue()*0.25;
    else if (getSquareFeet() <= 1500 )
        tax = getMarketValue() * 0.10;
    else 
        tax = getMarketValue() * 0.20;
    return tax;

}

在这一行中,您将oneDword的“引用”添加到您的twoDWords列表中。您每次都要添加对同一个oneDword的引用。因此,最终列表大小为5,但它们都包含对oneDword列表的引用(您将在中间循环中继续增长。