我的程序从用户输入一个字符串作为输入。特别是,该方法返回字符串中的每个唯一字符以及重复的次数。输出按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")));
}
答案 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中使用稳定排序,所以你不应该有问题。除此之外,您可以使用比较功能获得帮助。希望它能给你一般的看法