在Java中查找字符串中的所有大写字母

11

我正在尝试找出用户输入的字符串中的所有大写字母,但我一直得到这个运行时错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: 
String index out of range: 4
at java.lang.String.charAt(String.java:686)
at P43.main(P43.java:13)

我感到很愚蠢,但我就是想不出来,甚至在有关java.lang.StringIndexOutOfBoundsException的页面上Oracle也谈到了charAt。

以下是我的代码,用于查找大写字母并打印它们:

import java.io.*;
import java.util.*;

public class P43{
   public static void main(String[] args){
      Scanner in = new Scanner(System.in);
      //Uppercase
      String isUp = "";
      System.out.print("Please give a string: ");
      String x = in.next();
      int z = x.length();
      for(int y = 0; y <= z; y++){
         if(Character.isUpperCase(x.charAt(y))){
            char w = x.charAt(y);
            isUp = isUp + w + " ";
         }
      }
      System.out.println("The uppercase characters are " + isUp);
      //Uppercase
   }
}

我非常感激任何意见和帮助。


只是提醒,给你的变量/类/方法命名有意义的名称,而不是将它们命名为x、y、z和w。 - Can't Tell
当然。请注意,在我的回答中我使用了标识符,例如inputString。在嵌套循环的索引中使用i,j,k,您可以使用c表示字符,但其他任何内容都应该给它一个适当的名称。 - azz
应该是 for(int y = 0; y < z; y++) .. - Igal Karlinsky
10个回答

19
for(int y = 0; y <= z; y++){

应该是

for(int y = 0; y < z; y++){

记住数组索引从零开始。

String长度返回

字符串中的16位Unicode字符数

因为循环从零开始,所以循环应该在长度-1处终止。


1
谢谢,我现在感觉真的很愚蠢哈哈。初学者的错误。 - EvanD

10

数组越界是由于for循环没有在length - 1上终止,而是在length上终止。

大多数迭代的for循环应该采用以下形式:

for (int i = 0; i < array.length; i++) {
    // access array[i];
}

字符串也一样。

或许更简洁的方式是:

String inputString; // get user input

String outputString = "";

for (int i = 0; i < inputString.length; i++) {
    c = inputString.charAt(i);
    outputString += Character.isUpperCase(c) ? c + " " : ""; 
}
System.out.println(outputString);

编辑:忘记了String没有实现Iterable<Character>,Java真是太傻了。


8

使用Java 8,您还可以使用lambda表达式。将String转换为IntStream,使用过滤器仅获取大写字符,并通过将过滤后的字符附加到StringBuilder来创建一个新的String

Scanner in = new Scanner(System.in);
System.out.print("Please give a string: ");
//Uppercase
String isUp = in.next()
        .chars()
        .filter(Character::isUpperCase)
        .collect(StringBuilder::new, // supplier
                StringBuilder::appendCodePoint, // accumulator
                StringBuilder::append) // combiner
        .toString();
System.out.println("The uppercase characters are " + isUp);
//Uppercase

灵感来自:


4

Try this...

Method:

public int findUpperChar(String valitateStr) {
    for (int i = valitateStr.length() - 1; i >= 0; i--) {
        if (Character.isUpperCase(valitateStr.charAt(i))) {
            return i;
        }
    }
    return -1;
}

用法:

String passwordStr = password.getText().toString();

 .......

int len = findUpperChar(passwordStr);

if ( len != -1) {

      capitals exist.   

  } else {

      no capitals exist.            
}

2
我知道的最简单的方法是使用正则表达式替换。
isUp = x.replaceAll("[^A-Z]", "");

简单来说,这使用了一个正则表达式,匹配任何不在A-Z范围内的字符,并用空字符串替换它。

1

嗨,查找给定字符串中大写字符的一个简单步骤是...

程序

import java.io.*;
public class testUpper 
{
    public static void main(String args[]) throws IOException
    {
        String data,answer="";
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter any String : ");
        data=br.readLine();
        char[] findupper=data.toCharArray();
        for(int i=0;i<findupper.length;i++)
        {
            if(findupper[i]>=65&&findupper[i]<=91) //ascii value in between 65 and 91 is A to Z
            {
                answer+=findupper[i]; //adding only uppercase
            }
        }
        System.out.println("Answer : "+answer);
    }
}

输出

输入任意字符串:

欢迎来到字符串世界

答案:WTHSWRD


0

您可以提高代码的可读性并从现代Java的一些其他功能中受益。请使用Stream方法来解决这个问题。此外,我建议在类中导入最少量的库。请避免在导入时使用“*”。

import java.util.Scanner;

public class P43 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Please give a string: ");
        String x = in.next();
        x.chars().filter(c -> Character.isUpperCase(c))
                .forEach(c -> System.out.print((char) c + " "));
    }
}

样例输入:

saveChangesInTheEditor

样例输出:

C I T E


0
import java.util.Scanner;
class Demo
{
    public static void main(String[] args)
    {
         StringBuilder s=new StringBuilder();
         Scanner input = new Scanner(System.in);
         System.out.println("Enter your String");
         String str= input.nextLine();

         for(int i=0; i<str.length(); i++)
         {
            if(Character.isUpperCase(str.charAt(i)))
            {
               System.out.print(str.charAt(i)+" ");
            }
         }
      }
}

-1
public class Cama {

public static void main(String[] args) {
    String camal = "getStudentByName";
    String temp = "";
    for (int i = 0; i < camal.length(); i++) {
        if (Character.isUpperCase(camal.charAt(i))) {
            System.out.print(" " + Character.toLowerCase(camal.charAt(i)));
        } else if (i == 0) {
            System.out.print(Character.toUpperCase(camal.charAt(i)));
        }else{
            System.out.print(camal.charAt(i));
        }
    }
}
}

输出 = 按姓名获取学生 - Rajitha Bhanuka
1
这个答案没有解释为什么它有用。如果还有一个解释说明这段代码如何回答用户的问题,那么这段代码将会更加有用。 - help-info.de

-1
public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("Enter the number");
    String str= input.nextLine();

    int ascii;
    for(int i=0; i<str.length(); i++) {
        ascii = str.charAt(i);
        System.out.println(ascii);
        if (ascii >= 65 && ascii <= 90) {
            System.out.println("captal letter found ::: "+ascii);
        }
    }
}

嗯,有50442个字母字符,其中1155个是大写字母。ASCII不相关。charAt返回一个UTF-16代码单元。UTF-16是Unicode字符集的一种编码方式。 - Tom Blodget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接