统计一个字符串中的英文字母数量,并且将多个字母替换成一个下划线。
例 北京2008,beijing2008-->北京2008,_2008
下面是我的代码: 
import java.util.Scanner;
import java.lang.*;public class Test2 { public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串:");
String str = sc.next();
int n = 0;
for (int i = 0; i < str.length(); i++) {
if (Character.isLetter(str.charAt(i))) {
n++;
}
}
System.out.println("英文字母数量:");
System.out.println(n);
for (int j = 0; j < str.length(); j++) {
int len=str.length();
if (Character.isLetter(str.charAt(j))) {
str = str.replace(str.charAt(j),'_');
}

str = str.replace("__", "_");
if(str.length()==len-1){
j--;
}
}
System.out.println(str);
}}
求好心人帮忙改改

解决方案 »

  1.   


    import java.util.Arrays;
    import java.util.Scanner;public class Test { public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入字符串:");
    String str = sc.next();

    char[] ca = str.toCharArray();

    int n = 0;

    for(int i=0; i<ca.length; i++) {
    if('a'<=Character.toLowerCase(ca[i]) && Character.toLowerCase(ca[i])<='z') {
    n++;
    ca[i] = '_';
    }
    }

    System.out.println(Arrays.toString(ca));

    char[] cb = new char[ca.length];
    int k=0;
    for(int i=0; i<ca.length; ) {
    int j;
    for(j=i+1; j<ca.length; j++) {
    if(!(ca[i]=='_' && ca[j]=='_')) {
    break;

    }
    cb[k++] = ca[i];
    i = j;
    }
    StringBuilder sb = new StringBuilder();
    for(Character c : cb) {
    if(c.charValue() != 0)
    sb.append(c);
    }
    System.out.println(sb.toString());
    }
    }
      

  2.   

    替换英文字母可以用正则表达式 replaceAll("[a-zA-Z]","_");
    至于统计英文字母 循环判断一下 遇到 a-zA-Z 内的字母    字母数量就加1 最后打印出总数量就可以了
      

  3.   


    import java.util.*;public class Test {   public static void main(String[] args) throws Exception{
          Scanner sc = new Scanner(System.in);
          System.out.println("请输入字符串:");
          String str = sc.next();
          int count = 0;  //字母个数
          int position=0;   //字母前移插入位置
          boolean flag=true;  //判断是否在读连续的字母串,true表示否
          char c[]=str.toCharArray();
           int i;
          for (i = 0; i < str.length(); i++) {
             if (isLetter(c[i])) {   //isLetter()是自定义方法,因为Character.isLetter()判断汉字字符会返回true
                  count++;
                  if(flag){
                      if(count==1){   //count=1说明遇到第一个字符,此位置后面的非字母字符将前移覆盖字母字符,例如“1er4”,e位置被替换为_,4前移覆盖r,字符串变为“1_4”
                         position=i;
                        }
                       
                     flag=false;
                     c[position++]='_';
                    }
             }else if(count>0){
                flag=true;
                c[position++]=c[i];
             }
          }
          System.out.println("英文字母数量:"+count);
          System.out.println(new String(c,0,position));
       }   private static boolean isLetter(char c){
           if((c>'a'&&c<'z')||(c>'A'&&c<'Z')){
                return true;
            }
            return false;
       }
    }
      

  4.   

    因为Character.isLetter()判断汉字字符会返回true
    谢谢五楼了,我不知道Character.isLetter()方法汉字也会返回true。有注释真看着爽
      

  5.   

    一个 一个字符的判断,效率不高吧。import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test3 {

    //计算长度
    public static int calcLetter(String src)
    {
    int count = 0;
    if(src!=null&&!"".equals(src))
    {
    //本身长度-替换掉字母的长度
    count = src.length()-src.replaceAll("[A-Za-z]", "").length();
    }
    return count;
    } //转换字符串
    public static String transLetter(String src)
    {
    String result ="";
    if(src!=null&&!"".equals(src))
    {
    Pattern p = Pattern.compile("([A-Za-z]+)");
    Matcher m = p.matcher(src);
    result = src;
    while(m.find())
    {
    //替换正则表达式匹配的字符
    result = result.replaceFirst(m.group(1), "_");
    }
    }

    return result;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String test = "北京2008,beijing2008";
    System.out.println(Test3.calcLetter(test));
    System.out.println(Test3.transLetter(test));
    }}
      

  6.   

    既然你已经这样使用了正则,何必还用自己写方法计算长度呢.public static void transLetter(String src)
    {
    String result = "";
    int length = 0;
    if (src != null && !"".equals(src)) {
    Pattern p = Pattern.compile("([A-Za-z]+)");
    Matcher m = p.matcher(src);
    result = src;
    while (m.find()) {
    // 替换正则表达式匹配的字符
    result = result.replaceFirst(m.group(1), "_");
                                    //本次匹配的开始减去本次匹配的结束,就是本次匹配的字母数量了
    length += m.end() - m.start();
    }
    }
    System.out.println(result);
    System.out.println(length);
    }
      

  7.   


    replaceAll 用的就是正则啊。两个分开写是为了方便使用(便于修改)。
      

  8.   

    正则的话int n = str.length() - str.replaceAll("[a-zA-Z]", "").length();
    String str = str.replaceAll("[a-zA-Z]+","_");
      

  9.   

    只替换多个String str = str.replaceAll("[a-zA-Z]{2,}","_");