我如何找到并输出只出现一次的所有单词?

Posted

技术标签:

【中文标题】我如何找到并输出只出现一次的所有单词?【英文标题】:How do i find and output all the words that appear only once? 【发布时间】:2021-12-05 05:07:04 【问题描述】:

我必须找到只出现一次的单词(不多也不少)并输出它们。不幸的是,这是我目前所拥有的:

public static void main(String[] args) 
        System.out.println("Type in a sentence and click Enter:");
        Scanner scanner = new Scanner(System.in);
        String sentence = scanner.nextLine();
        System.out.println(sentence);
        String a[] = sentence.split(" ");
        int n = 0; //n will be the variable for the amount of a word's appearances
        for (int i = 0; i < a.length; i++) 
            if (a[i])  //Here i kinda want to find out how many times a certain word appears
            
        
    

【问题讨论】:

我推荐使用字典。让键是单词,值是找到单词的次数。如果一个键是新的,它不会在 Dictionary.keys() 返回的数组中。因此,对于每个单词,检查它是否在元素中,如果不是,将其添加为 1 作为值。否则只是增加它。这是字典类geeksforgeeks.org/java-util-dictionary-class-java的文档 @JamesE 最好使用地图。甚至字典的 Javadoc 都用粗体表示:“这个类已经过时了!”。 我强烈建议您将代码拆分为函数。每个功能都应该专注于一项任务。例如,输入/输出是一项任务;寻找独特的词是另一项任务。拥有一个查找唯一词的函数,以及另一个处理System.inSystem.out.println 的函数。不要将两者混为一谈。 【参考方案1】:

试试这个。

static List<String> onlyOnce(String sentence) 
    return Arrays.stream(sentence.split(" "))
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
        .entrySet().stream()
        .filter(e -> e.getValue() == 1)
        .map(Entry::getKey)
        .toList();


public static void main(String[] args) 
    System.out.println(onlyOnce("a b c d a c x y x"));

输出:

[b, d, y]

【讨论】:

【参考方案2】:

编辑(感谢@Pirate 的评论) 在Set 方式中,您需要两个而不是一个Set

使用Set&lt;String&gt; 确保每个条目只出现一次。 (但是,条目区分大小写。因此,您可能希望在插入之前将它们全部转换为大写或小写。)如果您使用这种方法,代码中的 for 循环可能如下所示:

Set<String> onceWords = new HashSet<>();
Set<String> repeatedWords = new HashSet<>();

for( int i = 0; i < a.length; i++ )
    /* If the word was already seen, add it to repeated list. */
    if( onceWords.contains( a[ i ] ) ) repeatedWords.add( a[ i ] );
    onceWords.add( a[ i ] );


/* Now, remove all the repeated words from the distinct list. */
onceWords.removeAll( repeatedWords );
    
System.out.println( onceWords );

【讨论】:

他不需要找到不同的词,他想找到只出现一次的词。 同意。误解了这个问题。谢谢。

以上是关于我如何找到并输出只出现一次的所有单词?的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 260.只出现一次的数字III

在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b

02:找第一个只出现一次的字符

C++信奥赛题目——第一个只出现一次的值

力扣第260题 只出现一次的数字 III

260. 只出现一次的数字 III