我如何找到并输出只出现一次的所有单词?
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.in
和System.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<String>
确保每个条目只出现一次。 (但是,条目区分大小写。因此,您可能希望在插入之前将它们全部转换为大写或小写。)如果您使用这种方法,代码中的 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 );
【讨论】:
他不需要找到不同的词,他想找到只出现一次的词。 同意。误解了这个问题。谢谢。以上是关于我如何找到并输出只出现一次的所有单词?的主要内容,如果未能解决你的问题,请参考以下文章