【问题标题】:How to count uppercase and lowercase letters in a string?如何计算字符串中的大写和小写字母?
【发布时间】:2014-10-03 04:47:53
【问题描述】:

哟,所以我试图制作一个可以从用户那里获取字符串输入的程序,例如:“ONCE UPON a time”,然后报告字符串包含多少个大写和小写字母:

输出示例:字符串有 8 个大写字母 该字符串有 5 个小写字母,我应该使用字符串类而不是数组,关于如何开始使用这个的任何提示?在此先感谢,这是我到目前为止所做的:D!

import java.util.Scanner;
public class q36{
    public static void main(String args[]){

        Scanner keyboard = new Scanner(System.in);
        System.out.println("Give a string ");
        String input=keyboard.nextLine();

        int lengde = input.length();
        System.out.println("String: " + input + "\t " + "lengde:"+ lengde);

        for(int i=0; i<lengde;i++) {
            if(Character.isUpperCase(CharAt(i))){

            }
        }
    }
}

【问题讨论】:

  • 在未来和现在,如果您首先尝试解决它,您将获得更好的帮助。如果你不这样做,我们怎么知道你被困在哪里或什么让你感到困惑?此外,你表现出你的努力在尊重你和你的问题方面获得了很大的收益,表明你愿意付出努力和主动尝试首先自己解决问题。此外,通过尝试并向我们展示努力,您会失去什么?
  • 如上所述。另请注意,Character 类有一个 Character.isUpperCase(char ch) 静态方法以及一个 Character.isLowerCase(char ch) 静态方法可以帮助您。
  • 别问——试试吧!你有一个触手可及的计算机编程实验室,所以使用它。实验、玩耍、编写代码、运行、更改、将其推向极限然后超越,找出有效的方法和无效的方法。相信我,你不会炸毁你的电脑,你不会因为努力而带来厄运和诅咒。不要在这里问我们——自己去寻找。这就是学习和编程的意义所在!
  • 是的,问题应该包含您已经尝试过和研究过的代码。
  • 提示:没有什么叫CharAt。如果您查看 String 的文档(您应该在开始这项工作之前完成),您会看到 一个名为 charAtinstance 方法。 实例方法 意味着它必须由一个“实例”来限定——一个类的对象。 (在这种情况下,该类当然是String,并且您的代码中有该类的一个对象。)

标签: java string character-class


【解决方案1】:

您只需遍历内容并使用字符功能对其进行测试。我使用的是真正的代码点,所以它支持 Unicode 的补充字符。

在处理代码点时,索引不能简单地加一,因为某些代码点实际上读取两个字符(也称为代码单元)。这就是我使用 while 和 Character.charCount(int cp) 的原因。

/** Method counts and prints number of lower/uppercase codepoints. */
static void countCharacterClasses(String input) {
    int upper = 0;
    int lower = 0;
    int other = 0;

    // index counts from 0 till end of string length
    int index = 0;
    while(index < input.length()) {
        // we get the unicode code point at index
        // this is the character at index-th position (but fits only in an int)
        int cp = input.codePointAt(index);
        // we increment index by 1 or 2, depending if cp fits in single char
        index += Character.charCount(cp);

        // the type of the codepoint is the character class
        int type = Character.getType(cp);
        // we care only about the character class for lower & uppercase letters
        switch(type) {
            case Character.UPPERCASE_LETTER:
                upper++;
                break;
            case Character.LOWERCASE_LETTER:
                lower++;
                break;
            default:
                other++;
        }
    }

    System.out.printf("Input has %d upper, %d lower and %d other codepoints%n",
                      upper, lower, other);
}

对于此示例,结果将是:

// test with plain letters, numbers and international chars:
countCharacterClasses("AABBÄäoßabc0\uD801\uDC00");
      // U+10400 "DESERET CAPITAL LETTER LONG I" is 2 char UTF16: D801 DC00

Input has 6 upper, 6 lower and 1 other codepoints

它将德语的Sharp-s视为小写(没有大写变体),将特殊补充代码点(两个代码单元/字符长)视为大写。该数字将被计为“其他”。

使用Character.getType(int cp) 而不是Character.isUpperCase() 的优点是它只需要查看多个(所有)字符类的代码点一次。这也可以用来计算所有不同的类(字母、空格、控件和所有花哨的其他 unicode 类(TITLECASE_LETTER 等)。

如需了解为何需要关注代码点和单元的背景知识,请查看:http://www.joelonsoftware.com/articles/Unicode.html

【讨论】:

  • @Sparta 为代码添加了更多解释,并删除了一些关于副主题的思考。
【解决方案2】:

只需创建在找到小写或大写字母时递增的计数器,如下所示:

for (int k = 0; k < input.length(); k++) {
    /**
     * The methods isUpperCase(char ch) and isLowerCase(char ch) of the Character
     * class are static so we use the Class.method() format; the charAt(int index)
     * method of the String class is an instance method, so the instance, which,
     * in this case, is the variable `input`, needs to be used to call the method.
     **/
    // Check for uppercase letters.
    if (Character.isUpperCase(input.charAt(k))) upperCase++;

    // Check for lowercase letters.
    if (Character.isLowerCase(input.charAt(k))) lowerCase++;
}

System.out.printf("There are %d uppercase letters and %d lowercase letters.",upperCase,lowerCase);

【讨论】:

  • 非常感谢,它奏效了,当另一个人说关于 charAt() 的东西时,我有点困惑:D,如果他没有把我引向错误的方向,我想我会做的它自己!我是如此接近!非常感谢男人! :) 实际上一开始有 input.charAt,但正如你在问题中看到的那样,将其替换为其他东西,因为我非常不确定如何使用它!!!
【解决方案3】:

你可以试试下面的代码:

public class ASCII_Demo
{
    public static void main(String[] args)
    {
        String str = "ONCE UPON a time";
        char ch;
        int uppercase=0,lowercase=0;
        for(int i=0;i<str.length();i++)
        {
            ch = str.charAt(i);
            int asciivalue = (int)ch;
            if(asciivalue >=65 && asciivalue <=90){
                uppercase++;
            }
            else if(asciivalue >=97 && asciivalue <=122){
                lowercase++;
            }
        }
        System.out.println("No of lowercase letter : " + lowercase);
        System.out.println("No of uppercase letter : " + uppercase);
    }
}

【讨论】:

  • 术语“ASCII 值”有点误导,您实际上将其转换为 unicode 代码单元。当您可以使用 Java 的国际化字符分类功能时,您应该避免将自己限制为仅使用 ASCII 代码集。
【解决方案4】:

使用正则表达式:

public Counts count(String str) {
    Counts counts = new Counts();
    counts.setUpperCases(str.split("(?=[A-Z])").length - 1));
    counts.setLowerCases(str.split("(?=[a-z])").length - 1));
    return counts;
}

【讨论】:

    【解决方案5】:

    Java8中的解决方案:

    private static long countUpperCase(String s) {
        return s.codePoints().filter(c-> c>='A' && c<='Z').count();
    }
    
    private static long countLowerCase(String s) {
        return s.codePoints().filter(c-> c>='a' && c<='z').count();
    }
    

    【讨论】:

      【解决方案6】:

      java 8

      private static long countUpperCase(String inputString) {
              return inputString.chars().filter((s)->Character.isUpperCase(s)).count();
          }
      
          private static long countLowerCase(String inputString) {
              return inputString.chars().filter((s)->Character.isLowerCase(s)).count();
          }
      

      【讨论】:

      • 这是一个明确的解决方案,但时间复杂度是公认解决方案的两倍
      • 为什么要两次?我们只考虑每个角色一次,对吧?
      【解决方案7】:
      import java.io.*;
      import java.util.*;
      public class CandidateCode {
          public static void main(String args[] ) throws Exception {
               int count=0,count2=0,i;
              Scanner sc = new Scanner(System.in);
               String s = sc.nextLine();
               int n = s.length();
               for( i=0; i<n;i++){
                   if(Character.isUpperCase(s.charAt(i)))
                       count++;
                   if(Character.isLowerCase(s.charAt(i))) 
                   count2++;
               }
                   System.out.println(count);
                   System.out.println(count2);
               }
      
      
      
      }
      

      【讨论】:

      • 不建议使用没有评论或解释的纯代码答案。请解释您的答案以避免否决
      • 这里,输入由用户通过 Scanner 类获取,Character.isUppercaes(s.charAt(i)) 行用于检查 String 类中定义的大写 charAt 方法,即用于查找特定位置的字符。
      • 建议直接放在问题上。
      【解决方案8】:

      您可以在此处提高代码的可读性并受益于现代 Java 的其他一些功能。请使用 Stream 方法来解决这个问题。另外,请尝试导入最少数量的库。所以,尽量避免使用 .*。

      import java.util.Scanner;
      
      public class q36 {
          public static void main(String[] args) {
              Scanner keyboard = new Scanner(System.in);
              System.out.println("Give a string ");
              String input = keyboard.nextLine();
              int numberOfUppercaseLetters =
                      Long.valueOf(input.chars().filter(c -> Character.isUpperCase(c)).count())
                              .intValue();
              int numberOfLowercaseLetters =
                      Long.valueOf(input.chars().filter(c -> Character.isLowerCase(c)).count())
                              .intValue();
              System.out.println("The lenght of the String is " + input.length()
                      + " number of uppercase letters " + numberOfUppercaseLetters
                      + " number of lowercase letters " + numberOfLowercaseLetters);
          }
      }
      

      示例输入:

      saveChangesInTheEditor

      示例输出:

      字符串长度为22个大写字母4个小写字母18个

      【讨论】:

        猜你喜欢
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 2021-01-06
        • 2019-08-08
        相关资源
        最近更新 更多