加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 23:56:35 所属栏目:Java 来源:网络整理
导读:我有一个字符串数组: String[] stringArray = {"x","y","z","x","a"}; 按照每个字符串频率与频率的频率顺序排列的最快/最有效的方法是什么? 我虽然将字符串用作HashMap中的键 String,Integer但这不会按频率排序 我考虑的另一种方法是使用TreeMap Integer,S
我有一个字符串数组:
String[] stringArray = {"x","y","z","x","a"};

按照每个字符串频率与频率的频率顺序排列的最快/最有效的方法是什么?

我虽然将字符串用作HashMap中的键< String,Integer>但这不会按频率排序

我考虑的另一种方法是使用TreeMap< Integer,String []>带有该整数的字符串列表,但似乎涉及很多检查..

我试图避免使用多个循环如果可能,因为我的String数组将比上面的数组大得多.谢谢!

编辑
我想要的只是能够按频率顺序输出字符串,并且最好能够将该字符串与其频率在数组中配对,例如两个输出数组:

["x","a"]
[3,2,1,1]

如果速度不是一个问题,这将是一个非常简单的问题,这就是为什么我在这里问伟大的思想:)

解决方法

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

>创建一个计数器对象 – 一个Map< String,Integer>列出每个字符串在输入中出现的次数:换句话说,它是一个频率图.这是O(n),因为您只需要遍历输入一次以构建地图
>使用上一个地图,创建一个包含其键的列表,使用项目的频率(地图中的值)作为排序标准进行排序.这是O(n log n),您可以使用比较器调用Collections.sort(),该比较器使用字符串频率进行比较

这就是我的意思:

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

final Map<String,Integer> counter = new HashMap<String,Integer>();
for (String str : stringArray)
    counter.put(str,1 + (counter.containsKey(str) ? counter.get(str) : 0));

List<String> list = new ArrayList<String>(counter.keySet());
Collections.sort(list,new Comparator<String>() {
    @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 + ",");
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读