温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用java实现打印字符串中字符出现的次数

发布时间:2020-11-11 15:11:29 来源:亿速云 阅读:233 作者:Leah 栏目:开发技术

使用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来作为记录容器

关于使用java实现打印字符串中字符出现的次数问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI