基于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来作为记录容器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java字符串常用操作方法(查找、截取、分割)

    如下所示: public class 字符串常用操作 { public static void main(String[] args) { /* * 查找子串 */ String str1="dwqae12232aebdalf"; //查找指定字符第一次出现的位置 int first1=str1.indexOf(97);//参数为字符的ascii码 //查找指定字符串第一次出现的位置 int first2=str1.indexOf("12"); //查找指定字符第一

  • java查找字符串中的包含子字符串的个数实现代码

    1. 用indexof的方法: public class Test11 { private static int counter = 0; /** * @param args */ public static void main(String[] args) { String str ="sdSS**&HGJhadHCASch& ^^"; int i = stringNumbers(str); System.out.println(i); } public static

  • java 查找字符串所在的位置代码

    使用了 String 类的 indexOf() 方法在字符串中查找子字符串出现的位置,如过存在返回字符串出现的位置(第一位为0),如果不存在返回 -1.方便判断和截取字符串! 语法:stringObject.indexOf(searchvalue,fromindex) 参数 描述 searchvalue 必需.规定需检索的字符串值. fromindex 可选的整数参数.规定在字符串中开始检索的位置.它的合法取值是0到 - 1.如省略该参数, 则将从字符串的首字符开始检索. 该方法将从头到尾地检索

  • Java的字符串中对子字符串的查找方法总结

    Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引. 3.int lastIndexOf(String str) :返回在此字符串中最右边出现的指定子字符串的索引. 4.int lastIndexOf(String str, int startI

  • 基于java查找最长字符串代码实例

    题目:编写程序,针对输入的N个字符串,输出其中最长的字符串 输入样例: 4 zhaoming zhangming sunming liming 输出样例: 最长的字符串:zhangming 代码如下 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); int

  • Java字符串查找的三种方式

    indexof方法: 注解:indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1. public class IndexOf{ public static void main(String[] args){ String s="李宏#王海#林巧#陆寻#唐梅"; String q="#"; //需要查找的字符串 String err="*"; //不存在的字符串 int i=0; for

  • java使用正则表达式查找包含的字符串示例

    本文实例讲述了java使用正则表达式查找包含的字符串.分享给大家供大家参考,具体如下: Hello.java: package hello; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Hello { public static void main(String[] args) { String re = "\\[([^\\]]+)\\]"; String str = &quo

  • Java实现查找当前字符串最大回文串代码分享

    先看代码 public class MaxHuiWen { public static void main(String[] args) { // TODO Auto-generated method stub String s = "abb"; MaxHuiWen(s); } //1.输出回文串 public static void MaxHuiWen(String s){ //存储字符串的长度 int length = s.length(); //存储最长的回文串 String M

  • java eclipse 整个项目或包查找只定字符串并替换操作

    java eclipse经常会用到整个类进行查找,ctrl+f,然后replaceall(XX,toXX).但是最近要对webservice上的项目进行检查,里面的运行程序不能有system.out.println这样的语句,因为服务器上的控制台输出会存储到一个指定路径的文件里,超过9gtomcat就会运行变慢,甚至挂掉.所以这里要用,ctrl+h,开启全项目或者全包搜索,用法如下: 1.选中项目名称或者包名称位置,ctrl+h 2弹出的界面中选取,file Search,在其中输入要查找的字符

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

    今天在面试时遇到一道算法的题: 给定一个字符串,输出每次字符出现的次数:要求按照顺序输出: 自己的思路开始是: 1.把String转换char数组 2.直接去遍历数组,获取每个字符出现次数,遇到不同时候重新记录 3.把结果用StringBuffer拼接后输出 public class Record { public static void main(String[] args) { System.out.println("直接遍历数组的方法:"+compressStrArray(&qu

  • Java统计字符串中字符出现次数的方法示例

    本文实例讲述了Java统计字符串中字符出现次数的方法.分享给大家供大家参考,具体如下: package com.wenzhi; import java.util.Scanner; public class Test01 { public static void main(String args[]) { Scanner scan = new Scanner(System.in); System.out.println("请你输入字符"); String str = scan.nextL

  • JavaScript基于扩展String实现替换字符串中index处字符的方法

    本文实例讲述了JavaScript基于扩展String实现替换字符串中index处字符的方法.分享给大家供大家参考,具体如下: 核心代码: String.prototype.replaceCharAt = function(n,c){ return this.substr(0, n)+ c + this.substr(n+1,this.length-1-n); } 用法示例: <!DOCTYPE html> <html lang="en"> <head&g

  • python实现查找两个字符串中相同字符并输出的方法

    本文实例讲述了python实现查找两个字符串中相同字符并输出的方法.分享给大家供大家参考.具体实现方法如下: seq1 = "spam" seq2 = "scam" res = [] for x in seq1: if x in seq2: res.append(x) print res 输出结果如下: ['s', 'a', 'm'] 希望本文所述对大家的Python程序设计有所帮助.

  • java实现统计字符串中字符及子字符串个数的方法示例

    本文实例讲述了java实现统计字符串中字符及子字符串个数的方法.分享给大家供大家参考,具体如下: 这里用java实现统计字符串中的字符(包括数字.大写字母.小写字母以及其他字符)个数,以及字符串的子字符串的个数. 运行效果图如下: 具体代码如下: import java.util.Scanner; public class Counter { static Scanner scanner = new Scanner(System.in); public static void count(Str

  • Java案例使用集合方法实现统计任意字符串中字符出现的次数

    需求:键盘录入一个字符串,统计其中各个字符出现的顺序 分析: 1.使用Scanner类获取一个字符串 2.创建HashMap集合,如果追求统计字符的美观性,可以使用TreeMap 3.遍历字符串得到每一个字符并将其作为TreeMap的键 4.通过键去集合中找相对应的值,看返回值是什么? 返回null:说明该字符在集合中不存在,就将该字符为键,次数1为值进行存储 返回的不是null:说明该字符在集合中存在,就再次将该字符作为键,次数+1为值进行存储 5.遍历集合 public class Tree

  • JS实现统计字符串中字符出现个数及最大个数功能示例

    本文实例讲述了JS实现统计字符串中字符出现个数及最大个数功能.分享给大家供大家参考,具体如下: js判断字符串中某字符出现的个数 今天碰到的一道题,比较简单,为了防止眼高手低还是写一下吧 <html> <head> <meta charset="utf-8" /> <title>www.jb51.net js判断字符串中某字符出现的个数</title> </head> <body> <script

  • C语言实现输入一个字符串后打印出该字符串中字符的所有排列

    本文实例讲述了C语言实现输入一个字符串后打印出该字符串中字符的所有排列的方法,属于数学里的排列问题.是一个很实用的算法技巧.分享给大家供大家参考.具体实现方法如下: 例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. C语言实现代码如下: /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream> #include <al

  • C#判断字符串是否存在字母及字符串中字符的替换实例

    本文实例讲述了C#判断字符串是否存在字母及字符串中字符的替换的方法.分享给大家供大家参考.具体实现方法如下: 首先要添加对命名空间"using System.Text.RegularExpressions;"的引用 下面以一个字符串为例: 复制代码 代码如下: string ss = "aaZ31 dd2f3"; string sss = ss.Replace(" ", "");//将字符串ss中的空格去掉 string ss

随机推荐