0

我编写了一个程序,它遍历一个字符串数组并打印唯一的单词及其出现,然后将它们打印到一个文件中。这部分工作得很好,但我无法弄清楚如何获得唯一单词的总数。我觉得我需要为计数器创建一个 int 数组,但我并没有完全掌握如何做到这一点。不幸的是,我不允许使用 Hashmap、Sets 或 Lists;必须坚持使用数组。

boolean [] done = new boolean[textfile.length];
for(int i = 0; i<textfile.length; i++){
    if(done[i])
        continue;
    int nb = 0;
    for(int j = i; j < textfile.length; j++){
        if(done[j])
            continue;
        if(textfile[i].equals(textfile[j])){
            done[j] = true;
            nb++;

        }
    }

    pw.println(textfile[i] + "occurs " + nb + " times");
}
4

5 回答 5

1

现在您正在将每个单词与文件中它之后的所有单词进行比较,这需要O(N^2)时间,您可以创建一个包含所有单词的数组,按字典顺序对其进行排序,这需要O(NlogN)时间,然后遍历数组并计算出现次数每个唯一单词(如果 2 个相邻单词相等,则继续计数,否则打印并重置计数器),这需要O(N)时间。

于 2013-10-09T10:31:20.317 回答
1

我会建议你做如下 -

- 将所有值添加到一个数组中并对该数组进行排序。(这样很容易获得唯一的条目)

- 将排序数组的所有元素(一个一个)与要比较的单词进行比较。

- 现在在将文本文件中的单词与数组中存在的单词进行比较时,维护一个全局变量i.e. counter,该变量将在每次出现唯一字符时递增,并将保留该值以供将来使用。

于 2013-10-09T10:50:38.783 回答
0

您可以在 first for 之外设置 uniqe_counter 并在打印前每次 nb == 1 时递增

于 2013-10-09T10:27:59.267 回答
0

您正在nb外循环的每次迭代中重新初始化变量。因此,您最终会丢失上次迭代中处理的唯一单词的计数。

你必须将int nb = 0;第一个 for 循环放在外面。

于 2013-10-09T10:29:38.137 回答
0

最简单的方法是:

  1. 对数组进行排序
  2. 遍历排序数组并记住最后一个唯一条目
  3. 如果 lastUniqueEntry 与下一个条目不同。唯一计数 + 1
  4. 做其他所有事情,比如打印独特的单词及其出现
于 2013-10-09T10:34:16.977 回答