我正在做一个学校项目,而不是让我做一个程序,而不是拿一个字符串,然后计算字符串中所有单词出现的次数。我已经成功地做到了这一点,通过对数组进行处理。一个数组是字符串数组,它保存单词和其他Integer数组,该数组保存单词出现的次数。一个特定的单词及其出现的次数在两个数组中具有相同的元素编号。
但我的问题是将它们按降序排序,我一开始以为我可以使用下面这行代码来实现:
Arrays.sort(thenumbers, Collections.reverseOrder());
但我意识到这会对单词出现的次数进行排序,但这会毁了整个程序,因为单词和数字在数组中会有不同的元素编号。
有没有办法解决这个问题?
如有任何帮助,将不胜感激,谢谢!
发布于 2019-11-13 18:29:54
如果您只想对数组执行此操作,而不使用Map,以便单词with count在同一对象中不相关,则可以实现一个自定义bublesort,它根据count数组对两个数组进行排序。
例如:
static void bubbleSort(String[] words, int[] wordCount) {
int n = wordCount.length;
String wordTemp = null;
int countTemp = 0;
for (int i = 0; i < n; i++) {
for (int j = 1; j < (n - i); j++) {
if (wordCount[j - 1] < wordCount[j]) { // < for reverse order, > for ascend
//swap words elements
wordTemp = words[j-1];
words[j-1] = words[j];
words[j] = wordTemp;
//swap wordcount elements
countTemp = wordCount[j - 1];
wordCount[j - 1] = wordCount[j];
wordCount[j] = countTemp;
}
}
}
}
它将在wordCount上应用bublesort算法(它保存每个单词的出现次数,并且在wordCount排序的同时,它将对单词进行排序。
运行以下示例,如
String [] words = {"four", "one", "five", "three", "six", "two"};
int [] wordCount = {4, 1, 5, 3, 6, 2};
bubbleSort(words, wordCount);
System.out.println("Words: " + Arrays.toString(words));
System.out.println("Word Count: " + Arrays.toString(wordCount));
产生
Words: [six, five, four, three, two, one]
Word Count: [6, 5, 4, 3, 2, 1]
发布于 2019-11-13 18:34:57
你不需要创建两个独立的数组。使用stream API可以很标准地找到每个单词在字符串中出现的次数:
import static java.util.stream.Collectors.*;
Map<String, Long> map = Arrays.stream(sourceString.split(" "))
.collect(groupingBy(Function.identity(), counting()))
这为您提供了一个以word为键的映射,以及它作为值出现的次数。然后,您可以使用Sort a Map by values中的任意解决方案按值对地图进行排序
发布于 2019-11-13 18:38:07
不同的答案是:做一个真正的OOP设计。
您在这里所做的是:您将数据放在两个不同的位置,然后通过在这两个数组中使用相同的索引,手动将相应的项“映射”在一起。
这基本上就是:过程性编程。
OOP的答案是:创建一个类来表示单个单词和及其出现次数!然后,您可以实现可比较接口,并一次性对这些对象的列表进行排序!
含义:其他答案在技术上都是正确的,因为它们告诉您如何在当前设计的情况下解决问题。但真正的答案是:用一些不同的东西替换您当前的设计,这将实现一个简单得多的解决方案!
https://stackoverflow.com/questions/58834501
复制相似问题