这是我必须编写的程序,但是我收到了这个错误,
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
50
使用两个数组(上部和下部)编写完整的程序以保持上部 分别是较低的字母表。 要求用户输入字符串示例:
这是木星的测试。很快你就会看到谁来自 木星!!!可能是D博士。
您的程序应解析字符串并跟踪字母数。两个数组的索引都是从0到25.这样做的逻辑方法是使用upper [0]来 计算'A'的数量,并计算上[1]的数量以计算'B'的数量,依此类推。同样 对于较低的阵列。
输出应如下所示:
A: 0 a:2
B: 0 b:0
.
.
.
Z:0 z:0
import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
public class Letter {
public static void main(String[] args) {
// this is get results
char[] chars = userEnters();
System.out.println();
System.out.println("Occurrences of each letter are:");
PrintArray(countLow(chars), countUp(chars));
}
public static char[] userEnters() {
String inputX = JOptionPane.showInputDialog("Enter line of text: ");
char[] chars = inputX.toCharArray();
return chars;
}
public static int[] countLow(char[] input) {
int[] counts = new int[26];
for (int i = 0; i < input.length; i++) {
counts[input[i] - 'a']++;
}
return counts;
}
public static int[] countUp(char[] input2) {
int[] countsUp = new int[26];
for (int i = 0; i < input2.length; i++) {
countsUp[input2[i] - 'A']++;
}
return countsUp;
}
public static void PrintArray(int[] counts, int[] countsUp) {
for (int i = 0; i < counts.length; i++) {
System.out.print(counts[i] + " " + (char) ('a' + i) + " ");
System.out.print(countsUp[i] + " " + (char) ('A' + i) + "\n");
}
}
}
答案 0 :(得分:7)
如果输入的字符不是大字符,countUp
会抛出异常,如果输入的字符不是小字符,countLow
会抛出异常。
示例:如果您在countLow
上致电A
,则会计算返回'A' - 'a'
的{{1}},并且不允许使用否定索引。
您需要检查逻辑并调用countLow或countUp,具体取决于字母的大小写并过滤掉无效字符。
或重构整个事物并使用-32
例如你持有小帽和大帽。
答案 1 :(得分:1)
我希望你不介意我对你的代码进行了一些重构。
请查看此问题的替代解决方案,然后阅读答案底部的评论。
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JOptionPane;
public class LetterCounter {
//Hash maps don't allow duplication.
//The letter will be the Key and the repetitions the value(Your goal!)
private Map<Character, Integer> resultsMap = new HashMap<Character, Integer>();
public static void main(String[] args) {
LetterCounter letterCounter = new LetterCounter();
letterCounter.fillMap();
letterCounter.showMapContents();
}
private void showMapContents() {
for (Entry<Character, Integer> entry : resultsMap.entrySet())
{
System.out.println("'" + entry.getKey() + "' - " + entry.getValue() + " times");
}
}
private void fillMap() {
char[] userInputAsArray = getUserInputAsLetterArray();
for (int currentLetter = 0; currentLetter < userInputAsArray.length; currentLetter++) {
int count = getOccurences(userInputAsArray[currentLetter],userInputAsArray);
resultsMap.put(userInputAsArray[currentLetter], count);
}
}
private int getOccurences(int letter, char[] userInputAsArray) {
int counter = 0;
for (int currentIndex = 0; currentIndex < userInputAsArray.length; currentIndex++) {
if(userInputAsArray[currentIndex] == letter)
counter++;
}
return counter;
}
public char[] getUserInputAsLetterArray() {
String userInput = JOptionPane.showInputDialog("Enter line of text: ");
char[] chars = userInput.toCharArray();
return chars;
}
}
我希望这很有用。
答案 2 :(得分:0)
您应该考虑从数组转移到更复杂,更强大的数据结构,如Map<Character,Integer>
。
使用该数据结构,您需要的代码看起来像
public Map<Character,Integer> countOccurrencies(String inputString){
Map<Character,Integer> occurrencies = new HashMap<Character,Integer>();
for(Character c : inputString){
if(occurrencies.containsKey(c)){
occurrencies.put(c, occurrencies.containsKey(c) + 1);
} else {
occurrencies.put(c, 1);
}
}
return occurrencies;
}
答案 3 :(得分:0)
在java中回答:
此处,countOfOccurances("pppggggkkkkpgaaaa")
为您提供字符串
public static void countOfOccurances(String mainStr)
{
String temp = "";
for (int i = 0 ; i < mainStr.length();i++)
{
CharSequence ch = String.valueOf(mainStr.charAt(i));
temp=mainStr.replace(ch, "");
int count = (mainStr.length()-temp.length());
System.out.println(ch+" = "+count);
mainStr = temp;
i = -1;
}
}
方法输出:
p = 4
g = 5
k = 4
a = 4