本方法思路:

1)先将字母排序去重,放入数组;
2)遍历字符串,统计每个字母出现的此处,并放入对应的数组中;
3)利用冒泡排序的方法,将次数大的放到前面,次数相同的不变(字母第一步已排升序)
此方法较为繁琐,不推荐。

较为便捷的方法:

一、先找到最大的次数,之后逐渐-1,对应匹配字母

1)通过map,方便快速的统计字母,以及字母出现的次数,同时达到了去重的效果;
2)遍历找到出现的最大次数(此时并不知道对应的字母);
3)由最大次数逐次-1,遍历map,匹配次数。
此方法同样笨拙,还不如冒泡排序有思想。

二、将字母、次数放入map中,再将map放入list中,重写list的sort方法

1)通过map.put(key,map.getOrDefalut(key,0)+1)放入字母与次数;
2)通过List<Map.Entry> list=new ArrayList<>(map.entrySet),将map放入list中;
3)通过Collections.sort(list,new Comparator<Map.Entry>(){
public int compare(Map.Entry o1,Map.Entry o2){
if(o1.getValue()!=o2.getValue()) {return (int)o2.getValue()-(int)o1.getValue();}
else {return (char)o1.getKey()-(char)o2.getKey()}}})

import java.util.*;

public class Main {
    public static void main(String[] args)  {
        Scanner scan=new Scanner(System.in);
        String input=scan.nextLine();
        String[] inputs=input.split("");

        //将字母放入数组中,并按升序排列
        String[] letters=Arrays.stream(inputs).distinct().sorted().toArray(String[]::new);

        //对应升序字母,计算个数放入对应的数组
        int[] amounts=new int[letters.length];
        //遍历字符串
        for(String item:inputs){
            for(int i=0;i<letters.length;i++){
                if(item.equals(letters[i])){
                    amounts[i]++;
                    break;
                }
            }
        }

        //采用类似冒泡排序的方法,将次数多的放前面,次数相同的不动 PS.同步移动次数和字母
        for(int i=1;i<amounts.length;i++){
            boolean flag=true;//判断是否发生排序
            for(int j=0;j<amounts.length-i;j++){
                if(amounts[j]<amounts[j+1]){
                    //次数变化顺序
                    int temp=amounts[j];
                    amounts[j]=amounts[j+1];
                    amounts[j+1]=temp;
                    flag=false;//表示发生排序动作

                    //字母同样变化顺序
                    String temp2=letters[j];
                    letters[j]=letters[j+1];
                    letters[j+1]=temp2;
                }
            }
            if(flag) break;
        }

        //输出
        System.out.println(String.join("",letters));

    }
}