Исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException: -65

Я пытаюсь решить этот вопрос https://www.hackerrank.com/challenges/pangrams и вот мой код

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Pangram {

public static String alltrim(String s)
{   String s1="";
    int i,j,k=0;
    for(i=0;i<s.length();i++)
    {
        char ch=s.charAt(i);
        if(ch!=' ')
        break;
    }
    for(j=s.length()-1;j>=0;j--)
    {
        char ch=s.charAt(j);
        if(ch!=' ')
        break;
    }
    for(k=i;k<j+1;k++) 
     s1 = s1 + s.charAt(k);

 return s1;
}
public static void main(String[] args)
{
    Scanner reader = new Scanner(System.in);
    String input = reader.nextLine();String s,s1;
    s = input.toLowerCase();
    s1 = alltrim(s);
    if( check(s1) )
        System.out.println("pangram");
    else
        System.out.println("not pangram");
}
public static boolean check(String input)
{
    int [] count = new int[26];
    for( int i = 0; i < input.length(); i++ )
    {
        char ch = input.charAt(i);
        count[ch-'a']++;
    }

    for( int cnt:count )
    {
        if( cnt ==0 )
            return false;
    }
    return true;
 }
}

я всегда получаю эту ошибку

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -65
      at Pangram.check(Pangram.java:46)
      at Pangram.main(Pangram.java:35)

я пытаюсь выяснить, где проблема, но я не могу... кто-нибудь может мне помочь?

3 ответа

Проблема в

count[ch-'a']++;

где ч 6(как вы вошли), и вы вычитаете '6'-'1' поэтому его генерация значения путем вычитания значений ASCII и дать

count[-43]++;

java.lang.ArrayIndexOutOfBoundsException: -65 случиться потому, что вы вычитаете a(97) к космическому символу, который представлен 32 в таблице ASCII (32-97=-65).

Что означает, что проблема в вашем allTrim метод, который не заменяет все пробелы, как вы, вероятно, ожидали.

Если вы хотите заменить все пробелы в вашей строке, вы можете использовать replaceAll метод Строка.

Откажитесь от s1 = alltrim(s); линия и заменить его на s1 = s.replaceAll(" ", "");,

Теперь вводя данные, которые вы дали мне в комментариях

aaabbb ab abc mnop xyyx xaxbbbxx

Не буду давать никаких исключений.

Что касается другого исключения, которое у вас было (вне границы -43), это просто потому, что вы ввели

6 aaabbb ab abc mnop xyyx xaxbbbxx

6 в таблице ASCII обозначено 54, 54-97 = 43. Глядя на требование по ссылке, которую вы нам дали, следует сравнивать только буквы алфавита, поэтому я полагаю, что это ошибка.

Обратите внимание, что вы можете легко удалить все номера строки, ваша строка замены станет:

s1 = s.replaceAll(" ", "").replaceAll("\\d", "");

Теперь это не даст никакой ошибки даже при входе

6 aaabbb ab abc mnop xyyx xaxbbbxx

Вот один из способов

    public static void main(final String[] args) throws IOException {
         Scanner reader = new Scanner(System.in);
         String line = reader.nextLine();
            // Verify input argument length.

            final char[] allCharacters = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
                    'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };


                    final TreeSet<Character> charactersPresent = new TreeSet<Character>();

                    // Parse the line into letters.
                    final char[] letters = line.toLowerCase().toCharArray();

                    // Keep a set of those that are present.
                    for (final char letter : letters) {
                            charactersPresent.add(letter);
                    }

                    // Print the letters present in the alphabet but not in the input.
                    final StringBuilder missingLettersBuilder = new StringBuilder();
                    for (final char character : allCharacters) {
                            if (!charactersPresent.contains(character)) {
                                    missingLettersBuilder.append(character);
                            }
                    }

                    if (missingLettersBuilder.length() == 0) {
                            System.out.println("This is  a PANGRAM");
                    } else {
                            System.out.println("Not a PANGRAM because it doesn't have "+missingLettersBuilder.toString());
                    }
            }
Другие вопросы по тегам