使用并行Arraylists从数组创建直方图

时间:2014-04-07 00:51:04

标签: java arrays arraylist histogram

我正在编写一个学习arraylists的程序。基本上它的作用是从一个字符串数组(每个单词)中提取并找到使用并行arraylists的重复项。有两个arraylists用于单词,一个用于每个单词出现的次数。单词列表的第0个点中的单词对应于计数列表的第0个点中的数字,依此类推。我成功地找到了重复的单词并计算了它们的出现次数,但是对于只出现一次的单词,我得到的数量为2,而我似乎无法找出原因。这是代码

String[] wordList = fileContents.split("\\s");

        ArrayList<String> words = new ArrayList<String>();
        ArrayList<Integer> counts = new ArrayList<Integer>();
        words.add(wordList[0]);
        counts.add(0);
        for (int i = 0; i < wordList.length; i++) {
            String tempWord = wordList[i];
            boolean foundEqual = false;
            int count = 0;
            for(int q = 0;q < words.size();q++) {
                if (tempWord.equals(words.get(q))) {
                    foundEqual = true;
                    counts.add(q, counts.get(q) + 1);
                } 

            }
            if(!foundEqual){
                words.add(tempWord);
                counts.add(1);
            }

        }
        for (int i = 0; i < words.size(); i++) {
            System.out.println(words.get(i) + ":" + counts.get(i));
        }

以下是单词

this is a test
this is also a test
this is the last test

这里是输出,你可以看到最后三项应该是1但是是2.

this:3
is:3
a:2
test:3
also:2
the:2
last:2

任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:3)

在print语句之前的调试器中查看countswords的结构时,很明显有些不妥。

words:       counts
  0 = this     0 = 3
  1 = is       1 = 3
  2 = a        2 = 2
  3 = test     3 = 3
  4 = also     4 = 2
  5 = the      5 = 2
  6 = last     6 = 2
               7 = 1
               8 = 0
               9 = 1
              10 = 1
              11 = 1
              12 = 1
              13 = 1
              14 = 1

问题是ArrayList中的add语句。来自Javadocs

  

将指定元素插入此列表中的指定位置。   移动当前位于该位置的元素(如果有)和任何元素   右边的后续元素(在索引中加一个)。

因此,每次执行counts.add(q, counts.get(q) + 1)时,您都会在列表中插入另一个元素。您应该使用set

for上设置断点并通过调试器(eclipse debugging tutorial运行)我可以看看每个阵列都在增长:

words:       counts
  0 = this     0 = 0

这是第一点:

    words.add(wordList[0]);
    counts.add(0);

当它再次点击for循环时:

words:       counts
  0 = this     0 = 1
               1 = 0

发生的事情是counts.add(0,1)在第0个位置放置了1,然后将数组中的其他所有内容都移了。

经过几次迭代后,我们再次回到这里。

words:       counts
  0 = this     0 = 1
  1 = is       1 = 0
  2 = a        2 = 1
  3 = test     3 = 1
               4 = 1

然后再次匹配'this':

words:       counts
  0 = this     0 = 2
  1 = is       1 = 1
  2 = a        2 = 0
  3 = test     3 = 1
               4 = 1
               5 = 1

你应该能够看到这种结构如何不正确地增长。

答案 1 :(得分:1)

除此之外:您的主循环应该从i = 1开始,因为在循环开始之前覆盖了i = 0

错误在于你计算每次后续旅行中的第一次出现。将q = 0更改为q = i + 1以避免这种情况。

您还必须检查您的最终条件。