以数字方式对此输出进行排序?

时间:2017-10-23 05:24:37

标签: java string sorting

我的程序从用户输入一个字符串作为输入。特别是,该方法返回字符串中的每个唯一字符以及重复的次数。输出按ASCII顺序排序(首先是最低的ASCII值)。有没有办法根据每个角色出现的次数(即最常见的角色,最不常见的角色最后)对此列表进行排序?此外,如果两个字符出现的次数相同,有没有办法首先列出ASCII表上的第一个字符?这是我试图解决的代码。

public static void alphabeticalSort(String input)
{
    int[] ascii = new int[256];

    for (int i = 0; i < input.length(); i++) {
        char current = input.charAt(i);
        ascii[(int)current]++;
    }

    System.out.println(IntStream.range(0, ascii.length).filter(x -> ascii[x] > 0).mapToObj(x -> String.format("%s: freq %s", (char) x, ascii[x])).collect(Collectors.joining("\n")));
}

2 个答案:

答案 0 :(得分:3)

您不需要char[] - 只需输入输入字符串,使用分组收集器收集它,该收集器会对事件进行计数并直接对结果地图进行排序:

input.chars()
     .mapToObj(c -> Character.valueOf((char) c))
     .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
     .entrySet()
     .stream()
     .sorted(Map.Entry.<Character, Long> comparingByValue()                    
                      .reversed()
                      .thenComparing(Map.Entry.comparingByKey()))
     .map(e -> String.format("%s: freq %d", e.getKey(), e.getValue()))
     .forEach(System.out::println); 

答案 1 :(得分:0)

我对你的问题采取了一些不同的方法,但它可能对你有帮助。您可以创建自己的对来计算频率,然后使用比较来使用频率对其进行排序,如果频率匹配,则使用char。 这是计算频率的。

    public class Pair
    {
        private char letter;
        private int freq;
        public Pair(char letter, int freq)
        {
            this.letter = letter;
            this.freq= freq;
        }
        public char getLetter(){
            return letter;
        }
        public int getFreq(){
            return freq;
        }
    }
    public static int countFreq(String str, char c)
    {
        int count = 0;
        for(int i = 0; i < str.length(); i++)
        {
            if(str.charAt(i) == c) 
                count++;
        }
        return count;
    }

调用此方法创建一对字母和频率

    public static List<Pair> createPair(String str)
    {
        String s = str;
        List<Pair> list = new ArrayList<Pair>();
        while(s.length() != 0)
        {
            list.add(new Pair(s.charAt(0), countFreq(s,s.charAt(0))));
            s.replaceAll(s.charAt(0),"");
        }
         return list;
    }

然后你可以使用字母然后使用frequnecy来稳定地对该对进行排序。 代码中可能存在错误,因为我没有对其进行测试,因为它是为了向您提供我的一般想法 您也可以参考here了解更多想法 对于排序,这里有各种稳定排序选项。在java by Colections.sort中使用稳定排序,所以你不应该有问题。除此之外,您可以使用比较功能获得帮助。希望它能给你一般的看法