Java计数数组中的字符串索引0

时间:2019-01-22 05:03:17

标签: java arrays string count

我正在尝试跟踪以数组中某些字母开头的字符串的出现。给定以下数组,请计算以“ T”,“ B”和“ A”开头的字符串出现的次数。

String[] month_codes = {"July 2007", "TRUCKS", "APPLES", "BEANS", "COATS", "BANANA", "CODES"}

每个月的输出如下:

      T  A  B 
July  2  1  2
Augu ....
Sept ....

这是我使用的代码,但只捕获了一次

public static int extract_counts(String[] month_array){

    for(int i=0; i < month_array.length; i++){
        System.out.println(month_array[i]);
        if(month_array[i].startsWith("T")){
            july_ab++;
            }

        }
        return july_ab;
    }

3 个答案:

答案 0 :(得分:0)

我要做的是遍历所有项目一次,计算出现的次数。然后,我将打印结果。

我认为,最简单的方法是使用整数数组来表示英语字母中的26个字母:

int[] frequency = new int[26];
// frequency[0] is the number of words that start with A

在这里,我们可以利用Java初始化一个全零的整数数组这一事实。

然后我们遍历month_array并计算每个字母以多少个单词开头。

for( String word : month_array ) {
  char firstLetter = word.toLowerCase().charAt(0);
  int index = firstLetter - 'a'; // a = 0, b = 1, etc.
  frequency[index]++;
}

在此for循环的末尾,frequency数组现在包含以每个字母开头的单词数。我们可以这样打印它们:

for(int i = 0; i < 26; i++) {
    System.out.print( frequency[i] ); 
}

当然,这是从A到Z的顺序。您可能还需要先遍历月份,然后再打印带有字母A-Z的标题。

在您的示例中,您的第一个单词是“ 2007年7月”-当然,在计数之前,您需要省略第一个项目,因为否则将人为地增加(例如)“ J”计数器。

public int[] extractCounts( String[] month_array ) {
   int[] frequency = new int[26];

    for(int i = 1; i < month_array.length; i++) { 
        // here, we start at 1 to omit the 'July 2007' record
        String word = month_array[i];
        char firstLetter = word.toLowerCase().charAt(0);
        int index = firstLetter - 'a';
        frequency[index]++;
    }
    return frequency;
}

public void printCounts(String month, int[] frequencies) {
    System.out.print(month + "\t");
    for(int frequency : frequencies) {
        System.out.print(frequency);
        System.out.print("\t");
    }
}

答案 1 :(得分:0)

您可以通过多种方式进行操作。

我为您提供了一种方法,该方法可以使用单循环和Map查找仅以“ A”,“ B”和“ T”开头的String的出现次数(起始字符)。

代码如下:

  public static Map<String, Integer> extract_counts(String[] month_array){
    Map<String, Integer> map = new HashMap<>();
    for(int i=0; i < month_array.length; i++){
        //System.out.println(month_array[i]);
        if(month_array[i].startsWith("T")){
            if(map.containsKey("T")){
                map.put("T", map.get("T") + 1);
            }else {
                map.put("T", 1);
            }
        }
        if(month_array[i].startsWith("A")){
            if(map.containsKey("A")){
                map.put("A", map.get("A") + 1);
            }else {
                map.put("A", 1);
            }
        }
        if(month_array[i].startsWith("B")){
            if(map.containsKey("B")){
                map.put("B", map.get("B") + 1);
            }else {
                map.put("B", 1);
            }
        }
    }
    return map;

调用方法:

String[] month_codes = {"July 2007", "TRUCKS", "APPLES", "BEANS", "COATS", "BANANA", "CODES"};
System.out.println(extract_counts(month_codes));

将得到这样的输出:

{A=1, B=2, T=1}

答案 2 :(得分:0)

String[] month_codes = ...;
Map<Character, Long> result = Arrays.stream(month_codes)
                                 .collect(Collectors.groupingBy(
                                             str -> Character.toLowerCase(str.charAt(0)),
                                             Collectors.counting()));

因此,Map<Character, Long>包含以下数据:

'a' -> 1
'b' -> 2
'c' -> 2
't' -> 1
'j' -> 1