【问题标题】:Find the unique words in a text file查找文本文件中的唯一词
【发布时间】:2013-03-20 11:30:53
【问题描述】:

我正在用 Java 编写这个程序来查找文本文件中的唯一单词。我想知道这段代码是否正确,因为它甚至将空格显示为单词。

String[] words;
List<String> uniqueWords = new ArrayList<String>();
words = str1.split("[!-~]* ");
for (int i = 0; i < words.length; i++)
{
    if (!(uniqueWords.contains (words[i])))
    {
        uniqueWords.add(words[i]);
    }
}

例如,如果我的输入是“Hello world!世界怎么样?”我的输出数组/集合/列表应该有 hello, world, how, is, the

【问题讨论】:

  • 把“”作为一个单独的词读没有太大的危害,只要你放弃它。有办法避免这种情况,但不是大问题。但是您需要(为了提高效率)使用某种哈希(可能是 HashSet)来检查您的单词列表,而不是进行线性搜索(contains 会这样做)。

标签: java string


【解决方案1】:

您可以使用Set 查找独特的词。 Set 是一个不包含重复元素的集合。

String[] words;
Set<String> uniqueWords = new HashSet<String>();
words = str1.split("[\\W]+");
for (int i = 0; i < words.length; i++)
{
    uniqueWords.add(words[i]);
}

【讨论】:

  • 是否需要检查单词是否存在? Set 无论如何都会只保留一个
  • 更好for ( String word : str1.split(...) )?
  • @assylias 正则表达式应该是什么?
  • @pratnala 你检查我的答案了吗?
【解决方案2】:

其他答案的略微修改版本(我喜欢它简短而简单):

String[] words = str1.split("[!-~]* ");
Set<String> uniqueWords = new HashSet<String>();

for (String word : words) {
    uniqueWords.add(word);
}

注意:如果你想在 !-~ 或空格上拆分,你应该使用这个:

String[] words = str1.split("[-!~\\s]+");

(破折号必须是第一个或最后一个)

【讨论】:

  • 我有一个小说的文本文件。我想得到小说中独特的词。显然标点符号必须去掉。
  • 如果您只需要正确的字母,为什么不拆分非字母:str1.split("[\\W]+");
  • 我会试一试,现在告诉你。请保持在线:)
  • 顺便说一句,我需要文字而不是字母。
  • @pratnala 是的,这很好 - str1.split("[\\W]+"); 会给你单词(它会在每次找到非字母字符时拆分字符串,如标点符号、空格等)
【解决方案3】:

如果我们真的要紧凑:

Set<String> unique = new HashSet<String>(Arrays.asList(str.toLowerCase().split("[-.,:;?!~\\s]+")));

【讨论】:

    【解决方案4】:

    Set 不允许重复,而 List 允许重复。

    String[] words;
    Set<String> uniqueWords = new HashSet<String>();
    words = str1.split("[!-~]* ");
    for (int i = 0; i < words.length; i++)
        uniqueWords.add(words[i]); //Here you need not to check with set because it wont allow duplicates
    

    【讨论】:

    • @pratnala 这里添加前不需要检查条件
    【解决方案5】:

    我建议您使用模式和匹配器并将结果放入 Set 中。

    public void getWords()
    {
        Set<String> words = new HashSet<String>();
        String pattern = "[a-zA-Z]+\\s";
        String match = "hello world how* are. you! world hello";
        Pattern compile = Pattern.compile(pattern);
        Matcher matcher = compile.matcher(match);
        while(matcher.find())
        {
            String group = matcher.group();
            boolean add = words.add(group);
            if(add)
            {
                System.out.println(group);
            }
        }
    }
    

    输出:

    hello 
    world 
    

    通过改变模式来改变你对“单词”的定义。

    【讨论】:

    • 但是输出应该有helloworldhowareyou
    • 这取决于您对“单词”的定义。请注意,某些单词上有特殊字符(例如 * !)。如果这些不被视为单词,则上面的正则表达式或“\\w+\\s”应该匹配一个或多个单词字符,后跟一个空格。我不会认为“如何*”是一个字典词。上面的代码 sn-p 应该解决任何输入字符串。
    • 但是我在这里从一本小说中获取信息。所以无论如何*不会发生
    • 小说吧?那就有点棘手了。使用上面的代码 sn-p 但调整正则表达式以包含带有以下字符的单词 - ' ; , : ( ) $ 。 .这些可以出现在任意文本中。示例 - '不要; 5 美元;他喜欢她(不是真的);句号以句号结束。'
    【解决方案6】:

    如果你想得到句子/任何文本中没有重复的单词,你可以试试这个:

       public static Map<String,Integer> getUniqueWords(String sentence){
       String[] word = sentence.split("[\\W]+");
            Map<String,Integer> uniqueWord = new HashMap<>();
            for (String e:word){
                if(!uniqueWord.containsKey(e)){
                    uniqueWord.put(e,1);
                }else{
                    uniqueWord.remove(e);
                }
            }
            return uniqueWord;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      相关资源
      最近更新 更多