【问题标题】:Creating a Histogram from an Array using parallel Arraylists使用并行 Arraylists 从数组创建直方图
【发布时间】:2014-04-07 00:51:03
【问题描述】:

我写了一个学习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

任何帮助将不胜感激!

【问题讨论】:

    标签: java arrays arraylist histogram


    【解决方案1】:

    在打印语句之前的调试器中查看counts 和words 的结构时,很明显有什么不对劲。

    词:计数 0 = 这个 0 = 3 1 = 1 = 3 2 = 一个 2 = 2 3 = 测试 3 = 3 4 = 也 4 = 2 5 = 5 = 2 6 = 最后 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) 运行它,我可以查看每个数组的增长情况:

    词:计数 0 = 这个 0 = 0

    这是来自:

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

    当它再次到达 for 循环时:

    词:计数 0 = 这个 0 = 1 1 = 0

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

    在多次没有找到之后,我们又回到了这个。

    词:计数 0 = 这个 0 = 1 1 = 1 = 0 2 = 一个 2 = 1 3 = 测试 3 = 1 4 = 1

    然后再次匹配“this”:

    词:计数 0 = 这个 0 = 2 1 = 1 = 1 2 = 一个 2 = 0 3 = 测试 3 = 1 4 = 1 5 = 1

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

    【讨论】:

    • 顺便说一句,您真的应该使用此代码来研究使用关联数组(在 Java 中称为 Map),它允许您拥有 String => Integer 关系存储而不是加倍的 ArrayList。这将是一次很好的学习体验。
    • 上面的解决方案修复了它,但我对你的很好奇。您说我在列表中添加了一个新元素,因此将所有内容都降低了,但是根据我在最新版本的 java(或更新版本)中的理解,他们更改了它,以便在您指定索引时它仅适用于预先存在的索引。也许我不明白你在说什么。感谢您的帮助!
    【解决方案2】:

    另外:你的主循环应该从i = 1开始,因为i = 0在循环开始之前就被覆盖了。

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

    因此,您还必须检查结束条件。

    【讨论】:

    • 非常感谢!慢慢掌握这些小东西!
    • 有不止一个错误,因为@MichaelT 的观点也是正确的。你必须remove,每次你add。
    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 2015-02-10
    • 1970-01-01
    • 2016-04-25
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多