(第一次写,有点紧张,写的不好多包涵)
https://www.52pojie.cn/thread-991326-1-1.html
(出处: 吾爱破解论坛)
下面进入正题:
Java一串由数字组成的字符串,求各个数字出现的次数,并按出现次数的大小从小到大排序,若出现的次数相同
若出现的次数相同,那就比较最后出现的位置,例如我给出的那个字符串,8和5都是出现2次,但8最后出现的位置比5最后出现的位置靠后,那么8就排在5的后面
。例如:
String s = "10771034948754277771578";
最后输出结果应该是
6:0次
3:1次
9:1次
2:1次
0:2次
5:2次
8:2次
4:3次
1:3次
7:8次
代码
class Num{
public int num; //数字
public int count;//次数
public int index;//首次出现位置
public int lastIndex;//最后出现位置
}
public static void main(String[] args) {
String s = "10771034948754277771578"; //源字符串
List<Num> lNum = new ArrayList<Num>();
int[] count = {0,0,0,0,0,0,0,0,0,0}; //计数器
for(int i = 0;i<s.length();i++) {
int val = Integer.valueOf(s.charAt(i)+"");
count[val]++;
}
for(int i = 0;i<count.length;i++) {
Num n = new Num();
n.num = i;
n.count = count[i];
n.index = s.indexOf(i+"");
n.lastIndex = s.lastIndexOf(i+"");
//插入位置
int p = 0;
//lNum 小于 0 直接在 位置 0 的位置添加
if(lNum.size() > 0) {
for(;p<lNum.size();p++) {
Num o = lNum.get(p);
//如果当前元素的下标为-1,continue
if(o.index<0) continue;
//如果新增对象下标为-1 或者当前元素的出现次数 大于新增对象的出现次数 break;
if(n.index<0 || o.count>n.count) break;
//如果出现次数相等的情况下
if(o.count == n.count ) {
//如果新增元素 最后出现位置 在当前元素之后 continue; 否则 break;
if(n.lastIndex > o.lastIndex) continue;
else break;
}
}
}
lNum.add(p,n);
}
lNum.forEach(n ->{
System.out.println(n.num +":"+n.count+"次");
});
}