Java 对输出进行数字排序?

Java 对输出进行数字排序?,java,string,sorting,Java,String,Sorting,我的程序接受一个字符串作为用户的输入。特别是,此方法返回字符串中的每个唯一字符以及重复的次数。输出按ASCII顺序排序(首先是最低ASCII值)。是否有办法根据每个字符出现的次数对列表进行排序(即最常用字符排在第一位,最不常用字符排在最后)?此外,如果两个字符出现的次数相同,是否有办法将ASCII表上的第一个字符列在第一位?这就是我正在努力解决的代码 public static void alphabeticalSort(String input) { int[] ascii = new

我的程序接受一个字符串作为用户的输入。特别是,此方法返回字符串中的每个唯一字符以及重复的次数。输出按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")));
}
公共静态无效字母排序(字符串输入)
{
int[]ascii=新的int[256];
对于(int i=0;iascii[x]>0).mapToObj(x->String.format(“%s:freq%s”,(char)x,ascii[x])).collect(收集器.加入(“\n”);
}

您不需要
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); 
input.chars()
.mapToObj(c->Character.valueOf((char)c))
.collect(Collectors.groupingBy(Function.identity()、Collectors.counting())
.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue()

.thenComparing(Map.Entry.comparingByKey())
.map(e->String.format(“%s:freq%d”,e.getKey(),e.getValue()))
.forEach(System.out::println);

我对您的问题有一点不同的看法,但它可能会帮助您。您可以创建自己的对来计算频率,然后使用比较来使用频率对其进行排序,如果frequency匹配,则使用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;
    }
公共类对
{
私人信件;
私人国际频率;
公共对(字符字母,整数频率)
{
这个字母=字母;
这个.freq=freq;
}
公共字符getLetter(){
回信;
}
公共int getFreq(){
返回频率;
}
}
公共静态int countFreq(字符串str,字符c)
{
整数计数=0;
对于(int i=0;i
调用此方法以创建字母和频率对

    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;
    }
publicstaticlist创建对(stringstr)
{
字符串s=str;
列表=新的ArrayList();
而(s.长度()!=0)
{
添加(新对(s.charAt(0)、countFreq(s、s.charAt(0)));
s、 全部替换(s.charAt(0),“”);
}
退货清单;
}
然后,您可以使用stable,然后使用letter和Frequency对这对进行排序。 代码中可能有错误,因为我还没有测试出来,因为这是为了让您了解我的总体想法。
您还可以参考更多想法。

对于排序,这里有各种用于稳定排序的选项。在java中,by Colections.sort使用稳定的排序,所以在这方面应该不会有问题。除此之外,您还可以使用比较功能获得帮助。希望它能给你一个大致的感觉,你的第一个
IntStream
对我来说什么都做不了。你的要求毫无意义。如果对数组进行排序,则字符将不存在。你需要使用一个映射或其他东西。FWIW,对数组进行排序非常简单:
Arrays.sort(ascii)字符将不存在是什么意思?如果按索引标识字符,则无法对值进行无序排列,同时仍保留与字符的关系。试试看,你很快就会明白我的意思。或者
mapToObj(c->(char)c)
@shmosel-yup,那就行了。我更喜欢
Character.valueOf
的明确性,但我想这比其他任何东西都更重要。我认为
mapToObj
已经非常明确了,但我想每个人都有自己的明确性。这对于BMP范围内的字符(
!Character.isSurrogate(c)
)在字符串中不组合字符非常有效(
Character.GetType(c)!=Character.NON\u space\u MARK
)。所以,没有