java - Java中按字符排序字符串列表
问题描述
我正在尝试编写一个程序来按列表中最不常见的字符对字符串列表进行排序。例如,如果列表是列表中[apple, orange, banana]
的字母频率,则为 a - 5, n - 3, p - 2, e - 2, l- 1, o - 1, r - 1, g - 1, b - 1 . 由于orange 包含最不常见的字母,因此程序将返回orange,然后是apple,然后是banana。
到目前为止,我已经编写了按频率对列表中所有字母进行排序的代码。但我需要应用它来查找哪个字符串包含最不常见的字母。
这是我的代码:
Map<Character, Integer> elemCount = new LinkedHashMap<>();
for (String word : words)
{
for (int i = 0; i < word.length(); i++)
{
if (elemCount.containsKey(word.charAt(i)))
{
elemCount.put(word.charAt(i), elemCount.get(word.charAt(i)) + 1);
}
else
{
elemCount.put(word.charAt(i), 1);
}
}
}
ArrayList<Character> sortedElems = new ArrayList<>();
elemCount.entrySet().stream().sorted(Collections.reverseOrder
(Map.Entry.comparingByValue())).forEach(entry ->
{
for (int i = 1; i <= entry.getValue(); i++)
{
sortedElems.add(entry.getKey());
}
}
);
System.out.println(sortedElems);
解决方案
试试下面的代码:
public static void main(String[] args){
List<String> list = new ArrayList<String>();
list.add("apple");
list.add("banana");
list.add("orange");
System.out.println(leastFrequentString(list));
}
private static Set<String> leastFrequentString(List<String> list){
Map<String, Integer> mapStringToFrequency = new HashMap<>();
for(String s:list){
Map<Character, Integer> mapCharacterToFrequency = wordFrequency(s);
int totalScore = 0;
for(Character c:mapCharacterToFrequency.keySet()){
if(mapCharacterToFrequency.get(c)>1){
totalScore+=1;
}
}
mapStringToFrequency.put(s,totalScore);
}
HashMap sortByValue = sortByValue(mapStringToFrequency);
return sortByValue.keySet();
}
private static Map<Character,Integer> wordFrequency(String s){
Map<Character, Integer> mapCharacterToFrequency = new HashMap<Character, Integer>();
for(Character c: s.toCharArray()){
if(mapCharacterToFrequency.containsKey(c)){
int frequency = mapCharacterToFrequency.get(c);
frequency +=1;
mapCharacterToFrequency.replace(c,frequency);
}else{
mapCharacterToFrequency.put(c,1);
}
}
return mapCharacterToFrequency;
}
private static LinkedHashMap<String, Integer> sortByValue(Map<String, Integer> hm)
{
// Create a list from elements of HashMap
List<Map.Entry<String, Integer> > list =
new LinkedList<>(hm.entrySet());
// Sort the list
list.sort(Comparator.comparing(Map.Entry::getValue));
// put data from sorted list to HashMap
LinkedHashMap<String, Integer> temp = new LinkedHashMap<>();
for (Map.Entry<String, Integer> aa : list) {
temp.put(aa.getKey(), aa.getValue());
}
return temp;
}
推荐阅读
- javascript - 在锚链接点击加载内容
- javascript - 设备方向传感器到 CSS 转换
- powershell - 用于从一个 OU 检索 PC 成员资格的 Powershell 脚本
- node.js - 重新安装后,“node”命令在错误的目录中查找
- android - 无法对具有不同高度和宽度的位图进行样式化
- docker - 容器扫描功能不适用于多个图像
- php - 类仅在将值定义为构造函数中的参数时才有效
- java - 如何修复 Spring Boot 中发生的“HttpMessageNotReadableException”和“SocketTimeOutException”
- angular7 - 根据请求,braintree-web API 中位置 1 处 JSON 中的意外令牌 o
- ruby-on-rails - 如何在 Ruby 中删除 \r\n?