java查找字符串出现次数_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 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 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
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值