• java 查找一个字符串中每个字符出现的次数,打印输出


    今天在面试时遇到一道算法的题:
    给定一个字符串,输出每次字符出现的次数;要求按照顺序输出;

    自己的思路开始是:
    1.把String转换char数组
    2.直接去遍历数组,获取每个字符出现次数,遇到不同时候重新记录
    3.把结果用StringBuffer拼接后输出

    public class Record {
    
        public static void main(String[] args) {
            System.out.println("直接遍历数组的方法:"+compressStrArray("aaacccddeffgghhhhaa"));
           
        }
        //直接遍历数组拼接,获得对字符记录结果是有序的,但是会出现重复字符的情况,在去修改重复字符逻辑也比较麻烦
        public static String compressStrArray(String srcStr) {
            char[] chars = srcStr.toCharArray();
            char c = chars[0];
            int i = 0;
            int a = 0;
            StringBuffer buffer = new StringBuffer();
            for (char aChar : chars) {
                a++;
                if (aChar != c) {
                    buffer.append(i).append(c+" ");
                    c = aChar;
                    i=1;
                }else {
                    i++;
                }
                if (a >= chars.length) {
                    buffer.append(i).append(c+" ");
                }
            }
            return buffer.toString();
        }
    
    }
    

    得到的结果是:3a 3c 2d 1e 2f 2g 4h 2a
    结果虽然是有序的,但会出现重复字符记录的情况,修改起来比较麻烦,于是暂时放下了,如果不考虑重复只考虑有序的话可以使用这种方法

    后来在晚上跑步的时候想到了可以使用map容器,一开始使用了HashMap

    public class Record {
    
        public static void main(String[] args) {
            System.out.println("使用Linkedhashmap容器的方法:"+compressStrArrayLinkedHashMap("cccddeffgghhhhaaa"));
    
        }
      
        //先吧字母存在hashmap容器中,在从hashmap中拿出来拼接,顺序是计算hashcode后的顺序,不是放入字符的顺序
        public static String compressStrArrayHashMap(String srcStr) {
            HashMap<Character, Integer> map = new HashMap<>();
            char[] chars = srcStr.toCharArray();
            for (char aChar : chars) {
                if (map.get(aChar)!=null) {
                    map.put(aChar,map.get(aChar)+1 );
                }else {
                    map.put(aChar,1 );
                }
            }
            StringBuffer buffer = new StringBuffer();
            for (Character character : map.keySet()) {
                if (map.get(character)!=1) {
                    buffer.append(map.get(character)).append(character+" ");
                }else {
                    buffer.append(character+" ");
                }
            }
            return buffer.toString();
        }
    
    }
    

    调整了一下字符,发现得到的结果是:3a 3c 2d e 2f 2g 4h
    记录的顺序是计算hashcode后的顺序,不是放入字符的顺序,但是去掉了重复字符,如果单纯记录次数可以使用hashmap

    最后在看api文档时候发现了还有一个LinkedHashMap可以保证放入对象的顺序,于是有将hashmap改为linkedhashmap

    public class Record {
    
        public static void main(String[] args) {
    
            System.out.println("使用Linkedhashmap容器的方法:"+compressStrArrayLinkedHashMap("cccddeffgghhhhaaa"));
    
        }
    
        public static String compressStrArrayLinkedHashMap(String srcStr) {
            LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
            char[] chars = srcStr.toCharArray();
            for (char aChar : chars) {
                if (map.get(aChar)!=null) {
                    map.put(aChar,map.get(aChar)+1 );
                }else {
                    map.put(aChar,1 );
                }
            }
            StringBuffer buffer = new StringBuffer();
            for (Character character : map.keySet()) {
                if (map.get(character)!=1) {
                    buffer.append(map.get(character)).append(character+" ");
                }else {
                    buffer.append(character+" ");
                }
            }
            return buffer.toString();
        }
    
    }
    

    最后得到结果是:3c 2d e 2f 2g 4h 3a
    顺序是放入字符的顺序,也没有了重复,如果要保证有序不重复的记录应该使用LinkedHashMap来作为记录容器

  • 相关阅读:
    一些文件的扩展名
    关于git,从svn转到git
    trousers--------dpkg: 处理软件包 trousers (--configure)时报错
    Ubuntu下运行DrClient以上网
    Ubuntu下的终端命令--复制文件从一个文件夹到另一个文件夹下
    VSCode放大字体的快捷键
    opessl版本过低造成的函数使用错误
    python的基本语法
    ubuntu和windows的解码方式
    ubuntu下强制删除文件夹
  • 原文地址:https://www.cnblogs.com/cqy1026/p/13899807.html
Copyright © 2020-2023  润新知