阵列中的捷径?

时间:2014-04-14 21:18:38

标签: java arrays

嘿,所有这一切都是我要求解决的问题:

  

编写一个程序,该程序将读入一行文本并输出文本中出现的所有字母的列表,以及每个字母出现的次数。以一个作为标记值的句点结束该行。这些字母在输出时应按字母顺序列出。使用长度为26的基本类型int数组,以便每个索引变量包含有多少个字母的计数。数组索引变量0包含a的数量,数组索引变量1包含b的数量,依此类推。允许使用大写和小写字母作为输入,但将相同字母的大写和小写版本视为相等。

到目前为止,这是我的代码

import java.util.Scanner;
public class Letters {

public static void main(String[] args) {
    Scanner keyboard = new Scanner(System.in);

    int letter[] = new int[26];

    System.out.println("Enter in a list of letters");
    String s = keyboard.nextLine();
    String a = s.toUpperCase();
    System.out.println(a);
    for(int i = 0; i<s.length();i++){
        switch (a.charAt(i)){
            case 'A':letter[0]++;
                break;
            case 'B': letter[1]++;
                break;
            case 'C':letter[2]++;
                break;
            case 'D': letter[3]++;
                break;
            case 'E':letter[4]++;
                break;
            case 'F': letter[5]++;
                break;
            case 'G':letter[6]++;
                break;
            case 'H': letter[7]++;
                break;
            case 'I':letter[8]++;
                break;
            case 'J': letter[9]++;
                break;
            case 'K':letter[10]++;
                break;
            case 'L': letter[11]++;
                break;
            case 'M':letter[12]++;
                break;
            case 'N': letter[13]++;
                break;
            case 'O':letter[14]++;
                break;
            case 'P': letter[15]++;
                break;
            case 'Q':letter[16]++;
                break;
            case 'R': letter[17]++;
                break;
            case 'S':letter[18]++;
                break;
            case 'T': letter[19]++;
                break;
            case 'U':letter[20]++;
                break;
            case 'V': letter[21]++;
                break;
            case 'W':letter[22]++;
                break;
            case 'X': letter[23]++;
                break;
            case 'Y':letter[24]++;
                break;
            case 'Z': letter[25]++;
                break;
            }
        }
    }
}
显然,我没有完成。所以我一步一步地解决这个问题,我现在遇到的问题是找到一种方法来显示所有字母出现在用户输入中的次数而不显示字母没有输入。我目前的想法是使用一堆if语句,但我知道这会变得非常混乱。

3 个答案:

答案 0 :(得分:1)

为了避免使用多个if语句,您可以使用以下简单的内容:

int index = a.charAt(i) - 'A';
letter[index]++;

您可能还想考虑字符串具有小字母和&amp;的可能性。其他特殊字符。

用于显示字母数:

for(int index = 0 ; index < letter.length ; ++index)
{
    if(letter[index] > 0 )
    {
        char ch = (char) ('A' + index);
        System.out.pritln("Char : " + ch + " , occurence : " + letter[i]);
    }
}

答案 1 :(得分:1)

你应该关注Map的更一般的想法。在这种情况下,Map<char, int>

Map<Char, Integer> frequency = new Map<Char, Integer>();
for(int i = 0; i<s.length();i++) {
    Char c = s.charAt(i).toLowerCase();
    if (frequency.containsKey(c)) {
      frequency.put(c, frequency.get(c)++);
    } else {
      frequency.put(c, 1);
    }
}

这种方法有哪些优点?首先,在数组中的特定位置索引特定字符是任意的。你真正在做的是计算角色。这使您可以使用frequence.get('x')查找字符数,其中x是您要查找的任何字符,甚至是包含字符的变量。其次,地图可以处理任意数量的字符 - 您无需提前计划。此方案中的新字符仅添加到地图中。

因为这是一个更通用的解决方案,您可以进一步利用Java API执行以下操作:

frequencey.values().toArray();

这可以保持核心对象的数据完整性,同时允许您将其作为任意数组输出。方法values()返回Collection个对象。请注意,Java Collections允许各种有趣的排序选项;通过键的值,频率(或Map的键 - >值对中的值的值),或者您可以想象的任意设置。

答案 2 :(得分:0)

请尝试以下方法作为主要方法:

public static void main(String[] args) {

    Scanner keyboard = new Scanner(System.in);

    int letterCount[] = new int[26];

    System.out.println("Enter in a list of letters");
    String inputString = keyboard.nextLine();
    char[] charArr = inputString.toUpperCase().toCharArray();
    System.out.println(charArr);
    for(char ch : charArr) {
        if(ch >= 'A' && ch <='Z') {
            letterCount[ch-'A']++;
        }
    }

    for(int i=0; i < letterCount.length; i++) {
        if(letterCount[i] > 0) {
            System.out.println(String.format("%c - %d", (i+'A'), letterCount[i]));
        }
    }

}