基于java查找并打印输出字符串中字符出现次数

 更新时间:2020年11月10日 08:33:43   作者:cqy19951026  
这篇文章主要介绍了基于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 实现下压栈的操作(能动态调整数组大小)

    java 实现下压栈的操作(能动态调整数组大小)

    这篇文章主要介绍了java 实现下压栈的操作(能动态调整数组大小),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • springmvc之获取参数的方法(必看)

    springmvc之获取参数的方法(必看)

    下面小编就为大家带来一篇springmvc之获取参数的方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • java实现后台图片跨域上传功能

    java实现后台图片跨域上传功能

    这篇文章主要给大家介绍了关于java实现后台图片跨域上传功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Java IO流之StringWriter和StringReader用法分析

    Java IO流之StringWriter和StringReader用法分析

    这篇文章主要介绍了Java IO流之StringWriter和StringReader用法分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Vert-x-通过异步的方式使用JDBC连接SQL

    Vert-x-通过异步的方式使用JDBC连接SQL

    在这篇文章中,我们将会看到怎样在vert.x应用中使用HSQL,当然也可以使用任意JDBC,以及使用vertx-jdbc-client提供的异步的API,这篇文章的代码在github
    2016-01-01
  • EasyUi+Spring Data 实现按条件分页查询的实例代码

    EasyUi+Spring Data 实现按条件分页查询的实例代码

    这篇文章主要介绍了EasyUi+Spring Data 实现按条件分页查询的实例代码,非常具有实用价值,需要的朋友可以参考下
    2017-07-07
  • 基于java中的PO VO DAO BO POJO(详解)

    基于java中的PO VO DAO BO POJO(详解)

    下面小编就为大家带来一篇基于java中的PO VO DAO BO POJO(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • java的socket请求和响应方式

    java的socket请求和响应方式

    这篇文章主要介绍了java的socket请求和响应方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java Integer[]和int[]互相转换方式

    Java Integer[]和int[]互相转换方式

    这篇文章主要介绍了Java Integer[]和int[]互相转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 快速上手Mybatis-plus结构构建过程

    快速上手Mybatis-plus结构构建过程

    这篇文章主要介绍了快速上手Mybatis-plus结构构建过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论