我有一个字符串=" helloworld"
我试图找到字符串中每个字符的频率,并且我使用TreeMap进行存储,因为它以升序存储。我知道使用 Map = new TreeMap 的方法,但它会对e = 1,h = 1,l = 2,o = 2这样的字母进行排序。所以我使用了 TreeMap map = new Treemap
所以它可以像这样排序1 = h,1 = w,1 = r,1 = d,2 = l这样我就可以得到这样的输出了 lohewrd
即最大出现的字母将首先放置,然后放在第二低的字母
因为我已经尝试将值放在树形图中,但它没有给出所需的结果。
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package forinterview;
import java.util.Map;
import java.util.TreeMap;
/**
*
* @author Amal
*/
public class RemoveDuplicate {
public static void main(String[] args){
String s= "geeksforgeeks";
Map<Integer,Character> map= new TreeMap<Integer,Character>();
for(int i=0;i<s.length();i++){
char c= s.charAt(i);
Integer value= sendKey(map,c);
//System.out.println(value);
if(value != null){
map.put((value)+1, c);
}else{
map.put(1, c);
}
}
System.out.println(map);
}
private static Integer sendKey(Map<Integer, Character> map, char c) {
for(Map.Entry<Integer, Character> entry:map.entrySet()){
if(c == (entry.getValue())){
return entry.getKey();
}
}
return null;
}
}
这里我使用了另一种方法来获取键,因为当我使用
int int value = map.get(ch [i)在循环内部时,我可以使用值+ 1来增加值#s; s显示错误。
答案 0 :(得分:2)
您可以使用Collectors.groupingBy
并将其过滤为stream
:
String s = "helloworld";
String[] array = s.split("(?!^)");
Arrays.stream(array).collect(Collectors.groupingBy(p -> p, Collectors.counting()))
.entrySet().stream()
.sorted(Comparator.comparing(a -> a.getValue()))
.forEach(key -> System.out.print(key.getKey()));
答案 1 :(得分:2)
您当前的方法会给出错误的输出,因为您要根据发生次数替换字符。 让我们举个例子: String s =“Fighter Jet” 字符'e'和't'在我们的字符串中出现两次。根据你的代码字符'e'将替换为't'。
**请尝试以下代码以查找字符出现**
public void countAlphabets(String s){
Map<Character,Integer> map= new HashMap<Character,Integer>();
for(int i=0;i<s.length();i++){
char c= s.charAt(i);
// Counting occurrence of alphabets
if(map.containsKey(c)){
map.put(c, map.get(c)+1);
}
else{
map.put(c, 1);
}
}
//Sorting Hashmap by values
Set<Entry<String, Integer>> set = map.entrySet();
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);
Collections.sort( list, new Comparator<Map.Entry<String, Integer>>()
{
public int compare( Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2 )
{
return (o2.getValue()).compareTo( o1.getValue() );
}
} );
for(Map.Entry<String, Integer> entry:list){
System.out.println(entry.getKey()+" ==== "+entry.getValue());
}
}
方法countAlphabets采用一个参数,即String,并将按字符的出现次数按升序打印字符。