A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马华 中级黑马   /  2013-4-30 13:38  /  1511 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马华 于 2013-4-30 20:14 编辑

下面的题能用正则表达式能按要求快速输出,但是我这种方法错在哪里?代码如下,谁能小小修改只输出123吗?
package com.itheima;

import java.util.HashSet;
import java.util.Set;

public class Dem {

        
        public static void main(String[] args) {
               
                Set<String>t = new HashSet<String>();
               
                t.add("abc");
                t.add("123");
                t.add("heima");
                t.add("a12d");
               
                for(String str: t){
                        //char []a = str.toCharArray();
                        
                        for(int i = 0;i<str.length(); i++){
                                if(str.charAt(i)<0||str.charAt(i)>9) break;
                                System.out.println(str);
                        }
                                
                }
                        
               
        }

}

10 个回复

倒序浏览
char charAt(int index)
          返回指定索引处的 char 值。 多看api
回复 使用道具 举报
本帖最后由 丘凤光 于 2013-4-30 13:49 编辑

这个for(String str: t){}循环已经是将集合中的元素一个个取出,
你在增强型for循环里边在定义一个for循环,遍历的是已经取出的每个字符串中的字符,这步已经多余了
这与你要取的集合中的纯数字元素不符合啊

如果你是要把123
和a12b中的12
都取出来的话,用你这种思想就是对的
回复 使用道具 举报
丘凤光 发表于 2013-4-30 13:48
这个for(String str: t){}循环已经是将集合中的元素一个个取出,
你在增强型for循环里边在定义一个for循环 ...

第二个for是过滤条件啊
回复 使用道具 举报
黑马华 发表于 2013-4-30 13:51
第二个for是过滤条件啊

哦,是,我没看清楚;P
一个个字符过滤效率有点低哦
回复 使用道具 举报
丘凤光 发表于 2013-4-30 13:58
哦,是,我没看清楚
一个个字符过滤效率有点低哦

这个是啊,正则没看毕老师的最后一节课程,所以玩玩这个试试,这个怎么改?
回复 使用道具 举报
本帖最后由 丘凤光 于 2013-4-30 14:13 编辑

我给你找到原因了
  1. package cn.qiu.day5;

  2. /**
  3. * 需求:假设有一个集合,里面装的是字符串,但有的字符串是纯数字,我想把它找出来并打印怎么办?例如下面就找个123这个并打印
  4. */
  5. import java.util.HashSet;
  6. import java.util.Set;

  7. public class Jihe {
  8.     public static void main(String[] args) {
  9.         Set<String>t = new HashSet<String>();        
  10.         t.add("abc");
  11.         t.add("123");
  12.         t.add("heima");
  13.         t.add("a12d");
  14.       //设定匹配规则
  15.         String regex="[\\d]+";
  16.       //增强for循环
  17.         for(String str:t){
  18.                 //如果和规则匹配就是数字,否者不是
  19.             /*if(str.matches(regex)){
  20.              System.out.println(str);
  21.             }else{
  22.                     System.out.println(str+"不是纯数字");
  23.             }*/
  24.                  for(int i = 0;i<str.length(); i++){
  25.                  if(str.charAt(i)<'0'||str.charAt(i)>'9') break;
  26.                          System.out.println(str);
  27.              }               
  28.         }
  29.     }
  30. }
复制代码
你忽略了一点,str.charAt(i)<'0'||str.charAt(i)>'9'这才是正确的。原因:比较的是ascii码,0和9的ascii码不是0和9

按你这种方法比如是"123"就会打印三次。也会和你的要求不符。增加一两句代码就好了,那个很简单,你能解决的啦

——
回复 使用道具 举报
把增强for循环 改成这样就可以了

                for (String str : t) {
                        if (str.matches("[0-9]{1,10}")) {//如果是 0-9的数字就输出
                                System.out.println(str);
                        }
                }
回复 使用道具 举报
import java.util.HashSet;
import java.util.Set;


public class Test {
          public static void main(String[] args) {
         
          Set<String>t = new HashSet<String>();
         
          t.add("abc");
          t.add("123");
          t.add("heima");
          t.add("a12d");
         
          for(String str: t){
                  
                  for(int i = 0;i<str.length(); i++){
                          if(!Character.isDigit(str.charAt(i))){
                                  break;
                          }
                          System.out.println(str);
                  }                 
          }
          }
}
最简单的就是调用Character.isDigit(str.charAt(i))方法,这样可以直接判断
回复 使用道具 举报
你想用的方法时错误的str.charAt(i)<0||str.charAt(i)得到的是char类型的,char类型还要转化为int类型,但是char转化为int的时候还是有差别的,char ='1',转化为int就是49,所以没办法通过>0和<9来判断是否为数字了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马