我正在尝试编写一个程序,根据列表中最不频繁的字符排列字符串列表。例如,如果列表是[apple, Orange, banana]
,列表中的字母频率将是a-5,n-3,p-2,e-2,l-1,o-1,r-1,g-1,b-1。由于橙色包含最不频繁的字母,程序将返回橙色,然后是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 class Main {
public List<String> sortAccordingly(List<String> unsortedList ) {
List<String> sorted=new ArrayList<>();
Map<String,Integer> freq=new TreeMap();
for(String s:unsortedList) {
Map<Character, Integer> fq = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
if (fq.containsKey(s.charAt(i)))
fq.replace(s.charAt(i), fq.get(s.charAt(i)) + 1);
else
fq.put(s.charAt(i), 1);
}
freq.put(s, Collections.max(fq.values()));
}
Map<String,Integer> sortedOne=freq.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(e1,e2)->e1,LinkedHashMap::new));
sortedOne.putAll(freq);
sorted.addAll(sortedOne.keySet());
return sorted;
}
public static void main(String[] args) {
List <String> list=new ArrayList<>();
list.add("apple");
list.add("orange");
list.add("banana");
System.out.println(new Main().sortAccordingly(list));
}
}
你可以用比较器
Comparator<String> valueCompare=new Comparator<String>() {
@Override
public int compare(String s, String t1) {
return freq.get(s).compareTo(freq.get(t1));
}
};
而不是
Map<String,Integer> sortedOne=freq.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(e1,e2)->e1,LinkedHashMap::new));
之后的功能将是
public List<String> sortAccordingly(List<String> unsortedList ) {
List<String> sorted=new ArrayList<>();
Map<String,Integer> freq=new TreeMap();
Comparator<String> valueCompare=new Comparator<String>() {
@Override
public int compare(String s, String t1) {
return freq.get(s).compareTo(freq.get(t1));
}
};
for(String s:unsortedList) {
Map<Character, Integer> fq = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
if (fq.containsKey(s.charAt(i)))
fq.replace(s.charAt(i), fq.get(s.charAt(i)) + 1);
else
fq.put(s.charAt(i), 1);
}
freq.put(s, Collections.max(fq.values()));
}
Map<String,Integer> sortedOne=new TreeMap<>(valueCompare);
sortedOne.putAll(freq);
sorted.addAll(sortedOne.keySet());
return sorted;
}
您可以将解决方案分为以下步骤:
这就是你如何找到最不频繁的信件。首先通过迭代elemCount
map找到最低频率。然后再次迭代地图,找到频率最低的字母:
int lowestFrequency = ...result from
List<Character> leastFrequentLetters = new ArrayList<>();
for (Map.Entry<Character, Integer> entry : elemCount.entrySet()) {
if (entry.getValue() == lowestFrequency) {
leastFrequentLetters.add(entry.getKey());
}
}
这就是你如何计算一个给定单词中有多少个字母是最少频率的字母:
int count = 0;
for (char c: word.toCharArray()) {
if (leastFrequentLetters.contains(c)) {
count = count + 1;
}
}
一旦你有了一个方法来检索或计算每个单词的这个计数,你就可以根据它对单词进行排序。有意义吗?
试试下面的代码:
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;
}
问题内容: 我有一个具有以下格式的字符串列表: …,我想根据零件的字母顺序对列表进行排序。我将如何去做呢? 问题答案: 要更改排序键,使用的参数: 与以下方法相同: 请注意,如问题中所述,这将是字母排序,因此对于2位数字的组件,它不会将它们解释为数字,例如,“ 11”将出现在“ 2”之前。
问题内容: 我想按长度顺序排列一个ArrayList字符串,而不仅仅是数字顺序。 例如,该列表包含以下单词: 需要根据它们的长度差异将它们排序为特殊字符串,例如: 因此最终列表如下所示(方括号中的差异): 问题答案: 使用自定义比较器: 然后使用对列表进行排序。
问题内容: 我创建了一个sqlite数据库,该数据库具有一个存储温度值的表。第一次将温度值以升序写入数据库。然后,我将数据库中的温度值读取到一个列表中,然后将该列表添加到组合框中以选择温度- 效果很好。 结果列表为: 然后,我向数据库添加一个新的温度值,例如“ 33”。 它被附加到表的末尾。如果我现在阅读温度,列表将变为: 如果我做或,最终的结果是 有什么简单的方法可以按升序对列表进行排序,以便得
本文向大家介绍Python对字符串列表进行排序,包括了Python对字符串列表进行排序的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将看到如何对字符串列表进行排序。我们将使用sort方法和sorted函数对给定的字符串列表进行排序。然后,我们将了解如何根据不同的条件(例如长度,值等)对字符串列表进行排序, 让我们看看如何使用list.sort方法对字符串列表进行排序。排序方法列表是一个
问题内容: 我有一个带有文件名的字符串列表: 输出: 但是我想要: 有没有简单的方法可以做到这一点? 问题答案: 是: 说明:字符串按词法排序,因此在字符串之前(因为< ,因此忽略第一个字符串之后的内容)。因此,我们使用的参数是一个回调函数,该函数接受一个列表项并返回用于对该项目进行排序的值- 在您的情况下,是从文件名的第一部分构建的整数。这样,列表就可以正确地按数值排序。
本文向大家介绍如何在Python中对字符串列表进行排序?,包括了如何在Python中对字符串列表进行排序?的使用技巧和注意事项,需要的朋友参考一下 要对列表进行排序,即对列表本身进行排序并更改列表本身的顺序,可以在字符串列表中使用。例如, 如果要保持原始列表不变,而要一个新的排序元素列表,则可以使用sorted(list)。例如,