黑马程序员技术交流社区
标题:
TreeMap集合查找字符串出现次数
[打印本页]
作者:
大漠孤烟
时间:
2014-5-5 22:48
标题:
TreeMap集合查找字符串出现次数
package com.itheima.connection;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo {
/**
*1.取出一个字符串中字母出现的次数。如:字符串如:"abcde%^kka27qoq" ,打印每个字母出现的次数如:a(2)b(1)k(2)..
*分析:1.字母与数字 之间存在映射关系,每个字母都对应出现的次数,用到Map集合
* 2. 保证数据的唯一性,保证按照 abcdefg 字母顺序排序 用到Map子类TreeMap集合
* 3.遍历集合,用字母作为键存储到Map中,存在就字母对应的取值+1存到集合中,字母相同的会覆盖
* 4.循环遍历结束Map集合存储的就是字母对应的次数
*/
public static void main(String[] args) {
String str = "abcdekka27qoA*&AAAq";
ToCharArray(str);
}
private static String ToCharArray(String str) {
char[] chr = str.toCharArray(); //字符串转换为字符串数组,方便遍历
Map<Character, Integer> map = new TreeMap<Character, Integer>();
int count=0;
for(int i=0;i<chr.length;i++){
if(chr[i]>='a'&&chr[i]<='z'&&chr[i]>='A'&&chr[i]<='Z'){
// 将字母作为键存放Map中,Integer接收字母
Integer value=map.get(chr[i]);
if(value!=null)
count=value;
count++;
map.put(chr[i], count);
count=0;
}
}
//保存将从集合中迭代出来的字母和次数
StringBuilder sbl=new StringBuilder();
//Map 转成Set
//Set keySet=map.keySet();
Iterator it=map.keySet().iterator();
while(it.hasNext()){
// Character key=it.next();
// Integer values=map.get(key);
Map.Entry<Character, Integer> me =(Entry<Character, Integer>) it.next();
//加到容器sb中
sbl.append(me.getKey() + "(" + me.getValue() + ")");
}
return sbl.toString();
}
}
执行结果没有任何反应
这几天看视频,有这样的练习题,我检查了几遍也纳闷不知道哪里出错了,希望大虾门帮忙看一下
作者:
来男.
时间:
2014-5-6 00:50
楼主:1,首先ToCharArray方法返回String类型值,你没接(应System.out.println(ToCharArray()),就永不会有结果;
2,你下面刚用完keySet方法又接着用entrySet,导致整个Iterator都没用上,所以才报“你使用了不安全的方法”。
我是单用keySet做的,简单易懂,你看看(已测试):
package demo;
import java.util.*;
class TreeMapDemo
{
public static void main(String[] args)
{
String str="sdajdjahds&^^%j&^7asd";
String result=getCount(str);
System.out.println(result);
}
public static String getCount(String str)
{
//将字符串转成数组
char[] arr=str.toCharArray();
Map<Character,Integer> map=new TreeMap<Character,Integer>();
for(int x=0;x<arr.length;x++)
{
if(!(arr[x]>='a'&&arr[x]<='z'||arr[x]>='A'&&arr[x]<='Z'))
{
continue;
}
//根据键得到值
Integer value=map.get(arr[x]);
int count=1;
if(value!=null)
{
count=value+1;
}
//将键和值加到map集合中去
map.put(arr[x],count);
}
return ksDemo(map);
}
private static String ksDemo(Map<Character,Integer> map)
{
StringBuilder sb=new StringBuilder();
//用keySet方法遍历
Iterator<Character> it=map.keySet().iterator();
while(it.hasNext())
{
Character key=it.next();
Integer value=map.get(key);
sb.append(key+"("+value+")");
}
return sb.toString();
}
}
作者:
大漠孤烟
时间:
2014-5-6 22:30
楼主,1.我加了System.out.println(ToCharArray())还是没打印出来
2.keySet 方法我都注释掉了,Map转Set 迭代遍历我是想用两种方式都测试一下。
3.楼主的确实可以,分开写清晰多了,不过我还是挺纳闷。。多谢啦。。。。。
作者:
创造命运
时间:
2014-5-7 07:52
我将你的代码改了一下,你可以看看。我分别使用了map.keySet()方法和map.entrySet()方法。运行过了,可是实现的所要求的功能。
import java.util.*
public class Test {
public static void main(String[] args) {
String str = "abcdekka27qoA*&AAAq";
System.out.println(ToCharArray(str));
}
private static String ToCharArray(String str) {
char[] chr = str.toCharArray(); //字符串转换为字符串数组,方便遍历
Map<Character, Integer> map = new TreeMap<Character, Integer>();
int count=0;
for(int i=0;i<chr.length;i++){
if
((chr
>='a' && chr
<='z') || (chr
>='A' && chr
<='Z'))
{ //这条语句是重点
// 将字母作为键存放Map中,Integer接收字母
Integer value=map.get(chr
);
if(value!=null)
count=value;
count++;
map.put(chr
, count);
count=0;
}
}
//保存将从集合中迭代出来的字母和次数
StringBuilder sb=new StringBuilder();
//Map 转成Set,
使用keySet
Set<Character> keySet = map.keySet();
Iterator<Character> it = keySet.iterator();
while(it.hasNext()){
Character key = it.next();
Integer values = map.get(key);
//Map.Entry<Character, Integer> me =(Entry<Character, Integer>)it.next();
//加到容器sb中
//sb.append(key + "(" + values + ")");
}
//使用Map.Entry,它的用法你可以参看毕老师的视频和、API文档。
Set<Map.Entry<Character, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<Character, Integer>> it1 = entrySet.iterator();
while(it1.hasNext())
{
Entry<Character, Integer> entry = it1.next();
Character key = entry.getKey();
Integer value = entry.getValue();
sb.append(key + "(" + value + ")");
//System.out.println(it1.next().getClass().getName());
}
return sb.toString();
}
}
作者:
大漠孤烟
时间:
2014-5-22 23:51
多谢楼市兄弟,还是粗心大意啊 第二个判断条件不能用&& 要用||或。。。
作者:
那窗_那世
时间:
2014-5-23 00:51
相互学习下,可能不太准确
import java.util.*;
class MapTest
{
public static void main(string[] str)
{
charcount("asbbdsdsdqt");
}
public static string charcount(string str)
{
char[] = str.toCharArray();
TreeMap<Charactor,Integer> tm = new TreeMap<Charactor,Integer>();
for(int x=0; x<chs.length;x++)
{
Integer value = tm.get(chs[x]);
if(value==null)
{
tm.put(chs[x],1);
}
else
{
value = value+1;
tm.put(chs[x],value);
}
}
system.out.println(tm);
return null;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2