将字符串中的字符按字符出现个数从大到小进行排序

最近同事出去面试,有个关于将字符串数组中的字符串按出现次数排序按从大到小,要求5分钟之内写出来。很尴尬,没有写出来。我也来一次回顾吧

对于这种:

1 String stri = "agasdfasdfdccvvasdfg";

或者这种

1 String str = "a,b,c,a,v,d,f,s,s,f,f,sd";

其实都是一样的。

第一种实现:

思路:1.将其转化为数组,2.定义一个map,key为字符/字符串的值,value为出现的次数

   3.将map的value集合进行排序,这个排序是从大到小的排序

   4.遍历排序后的value集合,如果原map中包含这个value,将重新将key和value写入到linkedHashMap中去

代码实现:

 1 public class TestSortDemo1 {
 2     public static void main(String[] args) {
 3         String str = "agadfsffdfvasdf";
 4         final char[] chars = str.toCharArray();
 5         Map<Character,Integer> map = new HashMap<>();
 6         for (char aChar : chars) {
 7             if(map.containsKey(aChar)){
 8                 map.put(aChar,map.get(aChar)+1);
 9             }else {
10                 map.put(aChar,1);
11             }
12         }
13         System.out.println(map);
14         List<Integer> list = new ArrayList<>();
15         for (Integer integer : map.values()) {
16             list.add(integer);
17         }
18         //将values进行排序
19         Collections.sort(list); //正序
20         //Collections.sort(list,Comparator.reverseOrder()); //逆序
21         System.out.println(list);
22         LinkedHashMap<Character,Integer> linkedHashMap = new LinkedHashMap<>();//不会改变插入的顺序
23         for (Integer value : list) {
24             for (Character character : map.keySet()) {
25                 if(map.get(character)==value){
26                     linkedHashMap.put(character,value);
27                 }
28             }
29         }
30         System.out.println(linkedHashMap);
31         System.out.println(linkedHashMap.keySet());
32     }
33 }

运行的结果:

切换到正序运行结果:

另一种实现方式:在第三步以后略有不同,但是思想基本是相同的,3.将map转为entryset,封装进list里面4,调用collections.sort方法,重写比较方法

具体代码实现:

 1 public static void main(String[] args) {
 2         String str = "agadfsffdfvasdf";
 3         final char[] chars = str.toCharArray();
 4         Map<Character, Integer> map = new HashMap<>();
 5         for (char aChar : chars) {
 6             if (map.containsKey(aChar)) {
 7                 map.put(aChar, map.get(aChar) + 1);
 8             } else {
 9                 map.put(aChar, 1);
10             }
11         }
12         System.out.println(map);
13         List<Map.Entry<Character,Integer>> list = new ArrayList<>();
14         list.addAll(map.entrySet());
15         Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
16             @Override
17             public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
18                 return o2.getValue() - o1.getValue();//从大到小           //return o1.getValue() - o2.getValue();//从小到大
19             }
20         });
21         System.out.println("从大到小的顺序:");
22         for (Map.Entry<Character, Integer> characterIntegerEntry : list) {
23             System.out.print(characterIntegerEntry.getKey()+",");
24         }
25     }

运性结果:

总结:

  两种实现的方式核心思想都是一样的,主要考察对集合的掌握。

后话:很久没看,猛一接触还是挺懵逼的。记录下来也是对知识的一次回顾吧。

原文地址:https://www.cnblogs.com/zfding/p/8590219.html

时间: 2024-07-30 04:10:52

将字符串中的字符按字符出现个数从大到小进行排序的相关文章

数组去重及排序/0~10随机数字/字符串中出现最多的字符及次数

数组去重及排序: var arr = [1,5,1,2,6,8,1,81,9,0]; for(var i=0;i<arr.length;i++){ for(var j=i+1;j<arr.length;j++){ if(arr[i] == arr[j]){ arr.splice(j,1); j--; } } } arr.sort(function(a,b){ return a-b; // 从小到大排序 }) alert(arr); // 0,1,2,5,6,8,9,81 arr.sort(fu

检测字符串中是否含有非法字符js代码

检测字符串中是否含有非法字符js代码:通常情况下,网站输入的字符串内容是需要经过检测的,因为有些字符带有一定的危险性,会对站点带来一定的危害,下面就介绍一下如何检测一个字符串是否含有非法字符,代码如下: function checks(str){ szMsg="[#_%&'\",;:=!^]"; alertStr=""; for(i=1;i<szMsg.length+1;i++){ if(str.indexOf(szMsg.substring

删除字符串中指定位置的字符

/********************************************************************** * 版权所有 (C)2015, Wu Yingqiang. * * 文件名称:DelPosChar.c * 文件标识:无 * 内容摘要:删除字符串中指定位置的字符 * 其它说明:无 * 当前版本: V1.0 * 作 者: Wu Yingqiang * 完成日期: 20150115 * ***********************************

Jquery判断某字符串中是否包含某个字符

if(!(to_city_value.indexOf("(")>0){ //code..... } Jquery判断某字符串中是否包含某个字符,布布扣,bubuko.com

[2013百度软件研发笔试题] 求字符串中连续出现同样字符的最大值

题目完整描写叙述为:用递归的方式实现一个求字符串中连续出现同样字符的最大值.如aaabbcc,连续出现a的最大值为3,abbc,连续出现字符最大的值为2. 下面是我想出来的方法: #include <iostream> using namespace std; #define MAX(a, b) (a) > (b) ? (a) : (b) int Get(char *s, int n, int m)  //字符指针, 当前最长串, max最长串 {     if(*(s+1) == '\

实现一个函数,可以左旋字符串中的k个字符

实现一个函数,可以左旋字符串中的k个字符. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA #include<stdio.h>  #include<stdlib.h>  void spin(char arr[],int num) //spin函数用以完成旋转字符的功能  {  char arr1[5] = {0};  char *str = arr; //创建两个指针都指向原字符数组的首地址  char *start = arr;  char *mov 

在字符串中删除特定的字符

题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入"I am lavor_zl."和"I love you.",则删除之后的第一个字符串变成"amar_z".要求相对于第一个字符串的长度n时间复杂度为O(n). 解题思路:用一个bool数组保存是否在第二个字符串中出现的所有字符,数组下标表示字符,这个数组的长度为256,因为C/C++中字符总共有256个.遍历第一个字符串,用一个指针或数组下标access来表示当前访问第

[2013百度软件研发笔试题] 求字符串中连续出现相同字符的最大值

题目完整描述为:用递归的方式实现一个求字符串中连续出现相同字符的最大值,如aaabbcc,连续出现a的最大值为3,abbc,连续出现字符最大的值为2. 以下是我想出来的方法: #include <iostream> using namespace std; #define MAX(a, b) (a) > (b) ? (a) : (b) int Get(char *s, int n, int m)  //字符指针, 当前最长串, max最长串 {     if(*(s+1) == '\0'

C语言--左旋字符串中的K个字符

问题: 3.实现一个函数,可以左旋字符串中的k个字符. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA #include<stdio.h> #include<assert.h> #include<string.h> void reserve(char* str, int len) { assert(str); char* start = str; char* end = str + len - 1; while (start < end