map的迭代

public class HashMapDemo {
  public static void main(String[] args) {
    String str = "匿名类是对原类的一个继承," +
        "同时创建了实例,{} 就是继承"+
        "以后的类体。类体中可使用所有类的语法。"+
        " 匿名类不能写构造器。";
    Map<Character, Integer> map = count(str);
    System.out.println(map); 
    //1 计算总字符数量, 累加结果中所有的Values
    //2 忽略字符, 使用HashSet实现
    //3 排序输出 top 10
    //map.values() 返回所有的value 的集合
    //对Map集合的一种迭代方式: 迭代所有的值(value)
    Collection<Integer> values = map.values();
    System.out.println(values);//所有value的集合
    int chars = 0;//字符数量
    for(Iterator<Integer> i=values.iterator();
      i.hasNext();){
      int n = i.next();
      chars+=n;//累加每个字符统计结果
    }
    System.out.println("总字符数量:"+chars); 
    //迭代输出Map集合中的每个<key:value>元素
    //map.entrySet()返回Set(元素不重复)集合, 每个元素
    //的类型是Entry类型, 每个entry元素包含属性key和Value, 
    //每个元素代表map中的key:value对
    Set<Entry<Character, Integer>> entrySet = 
      map.entrySet();
    System.out.println(entrySet); 
    //通过迭代entrySet变通的迭代Map集合, Map不能直接迭代
    for (Iterator<Entry<Character, Integer>> i = 
        entrySet.iterator(); i.hasNext();) {
      Entry<Character, Integer> entry = i.next();
      System.out.print(entry.getKey()+"\t");//取出统计字符
      System.out.print(entry.getValue()+"\t");//取出字符数量
      System.out.println(
          (double)entry.getValue()/chars*100+"%");
    }
    //Map有3种迭代方法: 迭代所有key, 迭代所有value 和 
    // 迭代Entey(key:value)
    //迭代map中所有key的集合, 实现输出统计结果
    Set<Character> keys=map.keySet();//返回所有key的集合
    System.out.println(keys);
    System.out.println("迭代keys"); 
    for(Iterator<Character> i=keys.iterator();
      i.hasNext();){
      Character ch = i.next();//每个key是统计结果中的字符
      Integer n = map.get(ch);//利用key查找value
      System.out.println(ch+":"+n+","+
          ((double)n/chars*100));
    }
    List<Entry<Character, Integer>> list = 
      new ArrayList<Entry<Character,Integer>>();
    list.addAll(map.entrySet());
    Collections.sort(list, new ByValue());//排序, 是对List集合进行排序
    int index = 0;
    for (Iterator<Entry<Character, Integer>> i = 
      list.iterator(); i.hasNext();) {
      Entry<Character, Integer> entry = i.next();
      Character ch = entry.getKey();
      Integer n = entry.getValue();
      System.out.println((index++)+":"+ch+":"+n+":"+
          ((double)n/chars*100)+"%");
      if(index==10){
        break;
      }
    }
  }
  public static Map<Character, Integer> count(
      String str){
    HashMap<Character, Integer> map = 
      new HashMap<Character, Integer>();
    HashSet<Character> ignore = 
      new HashSet<Character>();//被忽略的字符集合
    ignore.add(' ');
    ignore.add('\t');
    ignore.add('。');
    ignore.add(',');    
    for(int i=0; i<str.length(); i++){
      char ch = str.charAt(i);
      if(ignore.contains(ch)){//忽略字符包含ch就处理下一个
        continue;
      }
      Integer n = map.get(ch);
      map.put(ch, n==null? 1 : n+1);
    }
    return map;
  }
}
class ByValue 
  implements Comparator<Entry<Character, Integer>>{
  public int compare(Entry<Character, Integer> o1,
      Entry<Character, Integer> o2) {
    return -(o1.getValue()-o2.getValue());
  }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值