句子中的单词重复

时间:2014-07-14 18:42:20

标签: java string split

我用Java编写了一个小程序来查找句子中的重复单词。没有语法错误,没有复杂性错误,但是一旦运行它我就会收到一个奇怪的长错误。

class Find {

    public static void main(String args[]) {

        String M = "Hello World Hello Hello";
        String[] words = M.split(" ");

        for (int i = 0; i < M.length(); i++) {
            for (int j = 0; j < M.length(); j++) {
                if (words[i].equalsIgnoreCase(words[j])) {
                    System.out.printf("Duplicate Words :" + words[i], words[j]);
                }
            }
        }
    }
}

运行时:

Duplicate Words :HelloDuplicate Words :HelloDuplicate Words :HelloException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at Find.main(Find.java:9)

我做错了什么?请帮忙。

3 个答案:

答案 0 :(得分:5)

您希望迭代受

限制
words.length

不是M.length()

最好分割,然后使用HashSet<String> add(String)方法

将是O(n),您现有的解决方案是O(n^2)

答案 1 :(得分:1)

你正在使用的技术非常糟糕。

考虑这样的事情:

  1. 可能会强制输入字符串降低,以便&#34;你好&#34;匹配&#34; helLo&#34;排序时。
  2. 拆分字符串。
  3. 将数组的内容(由split返回)添加到List(可能是ArrayList)。
  4. 对列表进行排序。
  5. 遍历列表(恰好一次)。如果您不在列表中的最后一个元素上,并且当前单词与下一个单词相同(请记住,它们已排序)将当前单词添加到Set(可能是HashSet)。完成后,该集将包含所有重复的单词。

答案 2 :(得分:1)

我知道你已经找到了你想要的东西,但我用更少的头痛更好地解决了这个问题

代码:

        String M = "Hello World Hello Hello helLo hEllo worLD";
        String[] words = M.split(" ");
        List<String> wordsList = Arrays.asList(M.split(" "));
        wordsList.stream().map(s -> s.toUpperCase())
                          .distinct()
                          .forEach( s -> System.out.print(s + " "));

输出:

HELLO WORLD

注意:我在Java中使用了lambda

导入

import java.util.*;
import java.util.stream.Collectors;