java - 字符的排序频率

标签 java sorting frequency frequency-distribution

我刚刚做了一个算法来计算字符串中字符的频率。我感到困惑的是如何对频率进行排序,以便出现次数最多的字符列在顶部,最少的列在底部。

起初我尝试让另一个变量“fc”(用于频率计数器)与我原来的计数器变量“k”一致。然而,我陷入了如何对这个频率进行排序的思考过程中,我制作的 fc var 毫无用处。

感谢您提供的任何帮助!

这是我的代码:

  import java.io.*;
public class Freq
{
    public static void main(String args[])throws IOException
    {
        //read input stream
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        int ci,i,j,k,l,fc;l=0;
        String str,str1;
        char c,ch;
        System.out.println("Enter your String");
        str=in.readLine();
        i=str.length();
        //cycle through ASCII table chars and obtain chars typed
        for(c='A';c<='z';c++)
        {
            k=0;
            fc=0;           //fc keeps count like k
            for(j=0;j<i;j++)
            {
                ch=str.charAt(j);
                if(ch==c)
                    k++;
                    fc=k-1;     //was going to represent this counter for 'less than k'

            }
            if(k>0)
            System.out.println("The character "+c+" has occured for "+k+" times");
        }
    }
}

最佳答案

您需要先将它们全部存储起来。您可以使用 HashMap 来存储它们,这也将简化您的计数程序。然后对条目集进行 Collections.sort。您将需要制作一个 Comparable> 来比较条目值以进行排序。

编辑以添加示例代码....

    BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Enter your String");
    String line = in.readLine();
    HashMap<Character,Integer> counts = new HashMap<>();
    for(char c : line.toCharArray()) {
        Integer count = counts.get(c);
        if (count == null) {
            count = 0;
        }
        counts.put(c, ++count);
    }
    List<Entry<Character,Integer>> list = new ArrayList<>(counts.entrySet());
    Collections.sort(list, new Comparator<Entry<Character,Integer>>() {
        @Override
        public int compare(Entry<Character, Integer> o1,
                Entry<Character, Integer> o2) {
            return o2.getValue() - o1.getValue();
        }
    });
    for(Entry<Character,Integer> entry : list) {
        System.out.println("The character "+entry.getKey() +" has occured for "+ entry.getValue()+" times");
    }

关于java - 字符的排序频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21325022/

相关文章:

java - 使用 Android 的 AudioTrack 类生成正弦波、方波、三角波、锯齿波音频信号

java - 服务中的套接字 + 通知

java - 如何在 IntelliJ IDEA 中查看 JavaDoc?

java - JAVA vector 排序

mysql - 如何实现 facebook/linkedin 人名目录?

Elasticsearch如何返回每个文档的匹配词条数

c - 在C中的int数组中查找数字的频率

java - 独立于平台的方式来获取存储程序数据的路径

java - StackOverflowError 不知道出了什么问题

c++ - 在结构中为前 5 个创建最高值的索引