【问题标题】:Simplify s.charAt from 'a' || 'b' || 'c' || to one s.charAt从 'a' 简化 s.charAt || 'b' || 'c' ||到一个字符
【发布时间】:2014-01-01 23:18:21
【问题描述】:

我正在制作一个字母计数程序。除了使用 26 种情况外,有没有一种方法可以使用一种情况来增加字符串中的字母数。可以简化这个程序吗?

import javax.swing.JOptionPane;
public class CountLetters
{
   public static void main(String[] args)
   {
      {
      String str = JOptionPane.showInputDialog("Enter any text.");
      int count = 0;
      String s = str.toLowerCase(); 
      for (int i = 0; i < s.length(); i++) {
          if (s.charAt(i)==('a')||s.charAt(i)=='b'||s.charAt(i)=='c'||s.charAt(i)=='d'||s.charAt(i)=='e'||s.charAt(i)=='f'||
        s.charAt(i)=='g'||s.charAt(i)=='h'||s.charAt(i)=='i'||s.charAt(i)=='j'||s.charAt(i)=='k'||s.charAt(i)=='l'||
        s.charAt(i)=='m'||s.charAt(i)=='n'||s.charAt(i)=='o'||s.charAt(i)=='p'||s.charAt(i)=='q'||s.charAt(i)=='r'||
        s.charAt(i)=='s'||s.charAt(i)=='t'||s.charAt(i)=='u'||s.charAt(i)=='v'||s.charAt(i)=='w'||s.charAt(i)=='x'||
        s.charAt(i)=='y'||s.charAt(i)=='z') {
        count++;
        }
      }
      System.out.println("There are " + count + " letters in the string you entered.");
      }
   }
}   

有没有办法简化这个程序,所以只有一个 if 条件,而不是 26 个?

【问题讨论】:

    标签: java string if-statement for-loop


    【解决方案1】:

    只需使用大于和小于运算符:

    if (s.charAt(i) >= 'a' && s.charAt(i) <= 'z')
    

    【讨论】:

    • 根据是否可以接受高 Unicode 小写,Character.isLowerCase() 可能更具可读性。
    【解决方案2】:

    你甚至不需要循环。

    int count = str.replaceAll("[^a-zA-Z]","").length();
    System.out.println("There are " + count + " letters in the string you entered.");
    

    【讨论】:

      【解决方案3】:

      你可以使用 Java 的 Character 类:

      public String numLetters(String str){
          int count=0;
          for(int i=0; i<str.length(); i++){
              if(Character.isLetter(str.charAt(i))){
                  count++;
              }
          }
          return count;
      }
      

      【讨论】:

      • 这非常接近,除了它也匹配大写。
      • 是的,所以如果你只想计算小写字母,你可以使用 Character.isLowerCase(char) 而不是使用 Character.isLetter(char) 来代替
      • Soooo ...编辑你的答案;)他的代码只计算小写。
      • 我认为他在计算字母的数量,而不仅仅是小写字母。他将其转换为小写的原因是他可以使用这 26 种不同的大小写。如果他不将它转换为小写,那么他最终会得到 52 个不同的大小写,这将是一种痛苦的输入。
      • 是的 - 我完全跳过了他打电话给toLowerCase()的地方@
      【解决方案4】:

      您可以完全避免使用char,并通过matches() 使用带有正则表达式的substring()

      if (s.substring(i, i+1).matches("[a-z]"))
      

      (是的,(i, i+1) ...结束索引是排他的)

      编辑添加:考虑一下,

      if(Character.isLowerCase(s.chatAt(i))
      

      可能更好。忽略使用正则表达式的任何性能影响,这是最容易阅读的;看到它的人会立即理解其意图。

      【讨论】:

      • @DoorknobofSnow 您对matches 的使用无论如何都是错误的。 matches 仅在整个字符串与模式匹配时才返回 true,因此仅当 s 正好是一个字符长时才有效。 (substring 的 1-arg 版本也无济于事。)请注意,在使用 s.matches 时,在模式开头使用 ^ 是多余的。
      • @ajb 哎呀,哎呀,我最近一直在用 Ruby 正则表达式编程:P 抱歉,我会删除我的 cmets
      • @DoorknobofSnow 你让我仔细检查了一下自己的理智 :-)
      猜你喜欢
      • 1970-01-01
      • 2021-10-04
      • 2015-06-12
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多