Исключение в потоке "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());
}
}