java字符串数组出现频率 排序_java – 按频率排序字符串数组的最有效方法

您可以通过两个步骤解决此问题:

>创建一个计数器对象 – 一个Map< String,Integer>列出每个字符串在输入中出现的次数:换句话说,它是一个频率图.这是O(n),因为您只需要遍历输入一次以构建地图

>使用上一个地图,创建一个包含其键的列表,使用项目的频率(地图中的值)作为排序标准进行排序.这是O(n log n),您可以使用比较器调用Collections.sort(),该比较器使用字符串频率进行比较

这就是我的意思:

String[] stringArray = {"x","a"};

final Map counter = new HashMap();

for (String str : stringArray)

counter.put(str,1 + (counter.containsKey(str) ? counter.get(str) : 0));

List list = new ArrayList(counter.keySet());

Collections.sort(list,new Comparator() {

@Override

public int compare(String x,String y) {

return counter.get(y) - counter.get(x);

}

});

执行上述代码后,变量列表将包含以下值(未指定相同频率的元素之间的顺序):

[x,y,a,z]

将列表转换为数组是微不足道的:

list.toArray(new String[list.size()])

如果你需要找出每个字符串的频率,只需遍历排序的键:

for (String str : list) {

int frequency = counter.get(str);

System.out.print(str + ":" + frequency + ",");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值