每封信的出现次数

时间:2013-07-11 13:42:19

标签: java string search

这是我必须编写的程序,但是我收到了这个错误,

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");
    }
  }
}

4 个答案:

答案 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;
    }
}
  • 每当您想要进行需要操作数据的练习时,您应该为作业选择最佳数据结构。在您的情况下,我认为哈希映射可能很有趣,因为它避免了重复,并将为您完成大部分工作。在此链接中找到一个非常好的备忘单:http://www.janeve.me/articles/which-java-collection-to-use
  • 我注意到你使用了很多静态,这不是一个非常面向对象的事情。作为替代方案,如果你想在运行时做一些像这样的快速示例,你可以在其内部初始化类。

我希望这很有用。

答案 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