我正在尝试跟踪以数组中某些字母开头的字符串的出现。给定以下数组,请计算以“ 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;
}
答案 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