import java.util.Scanner;
public class abc {
public static void main(String[] args) {
char[] ch = str.toCharArray();
int len = ch.length;
for (int i = 0; i < len; i++) {
int counte = 0;
char c = str.charAt(i);
for (int j = 0; j < len; j++) {
if (c == ch[j]) {
counte++;
ch[j] = '\u0000';
}
}
if (counte > 0) System.out.print(c + "-" + counte + ",");
}
}
}
输入:
BBBBBbbbbbbCCooooPPPu
输出:
5-B,6-B,2-C,4-O,3-P,1-U
但我希望输出为:
6-B,5-B,4-O,3-P,2-C,1-U
我该如何解决这个问题?
答案 0 :(得分:0)
使用java.util
中的类检查此示例代码import java.util.*;
import java.text.*;
public class abc {
public static void main(String[] args) {
//String as parameter. Should be args[0]; or something?
String str = "BBBBBbbbbbbCCooooPPPu";
//Format with leading zeros to allow sorting up to 999
NumberFormat nf = new DecimalFormat("000");
//Create reverse-sorted set to hold counts
Set<String> sorted = new TreeSet<String>(Collections.reverseOrder() );
[...] //Do your thing as before...
if (counte > 0) {
//Add to Set (ordered...) using number format
sorted.add(nf.format(counte) + "-" + c);
}
}
//Join together set to create output String
StringJoiner sj = new StringJoiner(",");
for(String s : sorted) {
//Trim away leading zeros
sj.add(s.replaceAll("\\G0", ""));
}
//Output
System.out.println(sj.toString());
}
}
答案 1 :(得分:0)
不要打印值passport-local
,5-B
等。但是将它们的值存储在一个数组中,并且出现次数是关键:
6-b
最后用一些排序函数反转这个数组。
答案 2 :(得分:0)
你需要排序。
以下代码执行此操作,如果字母是连续的,请不要介意。
public static void see_string ()
{
List<Pair<Integer,String>> lp=new ArrayList<Pair<Integer,String>>();
Map<String, Integer> mci=new HashMap<String, Integer>();
// Populate
String str="mylongstringtoscanandsomore";
str="BBBBBbbbbbbCCooooPPPu";
int size=str.length();
for (int pos=0;pos<size;pos++)
{
String ch=str.substring(pos,pos+1);
int val=0;
if (mci.containsKey(ch)) {val=mci.get(ch);}
val++;
mci.put(ch, val);
}
// map => list
for (Map.Entry<String, Integer> e : mci.entrySet())
lp.add(new Pair<Integer,String>(e.getValue(),e.getKey()));
// SORT
reverse_sort(lp);
size=lp.size();
// See
for (int pos=0;pos<size;pos++)
{
System.out.println(lp.get(pos).getLeft()+"=>"+lp.get(pos).getRight());
}
}
// http://stackoverflow.com/questions/521171/a-java-collection-of-value-pairs-tuples
public class Pair<L,R> implements java.io.Serializable {
private final L left;
private final R right;
public Pair(L left, R right) {
this.left = left;
this.right = right;
}
public L getLeft() { return left; }
public R getRight() { return right; }
@Override
public int hashCode() { return left.hashCode() ^ right.hashCode(); }
@Override
public boolean equals(Object o) {
if (o == null) return false;
if (!(o instanceof Pair)) return false;
Pair pairo = (Pair) o;
return this.left.equals(pairo.getLeft()) &&
this.right.equals(pairo.getRight());
}
}
// T key to sort
static public <T extends Comparable<T>, Object,K extends Object>
void reverse_sort(List<Pair<T,K>> _list)
{
class ComparaterTK <T extends Comparable<T>,K> implements Comparator<Pair<T,K>>
{
public int compare(Pair<T,K> ob1, Pair<T,K> ob2)
{
return ob2.getLeft().compareTo(ob1.getLeft());
}
}
// simple sort
Collections.sort(_list, new ComparaterTK<T,K>());
}
答案 3 :(得分:0)
这是使用lambdas达到您要求的最简单方法。
String string = "BBBBBbbbbbbCCooooPPPu";
Stream.of(string.split(""))
.collect(Collectors.groupingBy(s -> s, Collectors.counting()))
.entrySet().stream().
sorted((Map.Entry<String, Long> o1, Map.Entry<String, Long> o2) -> o2.getValue().compareTo(o1.getValue())).
forEachOrdered(e -> System.out.print(e.getValue() + " - " + e.getKey()+", "));