Индекс числа строк Java 0 в массиве - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь отслеживать появления строк, начинающихся с определенных букв в массиве.Учитывая следующий массив, подсчитайте количество вхождений строк, которые начинаются с «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 голосов
/ 22 января 2019

Вы можете сделать это несколькими способами.

Я предоставляю вам способ, который может найти вхождения (Начальные символы), используя один цикл и Map для хранения только вхождения String, начинающегося с «A», «B» и «T».

Вот код:

  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}

0 голосов
/ 22 января 2019
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
0 голосов
/ 22 января 2019

Что бы я сделал, это перебрал бы все элементы один раз, посчитав количество вхождений.Затем я напечатал бы результаты.

Самый простой способ сделать это, по моему мнению, это использовать массив целых чисел, представляющих 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] ); 
}

Конечно, это будет в порядке от А до Я. Вы также, вероятно, захотите напечатать заголовки с буквами AZ, прежде чем повторять свои месяцы.

В вашем примере ваше первое слово - "июль 2007" - конечно, вам нужно было бы пропустить этот первый элемент перед подсчетом, так как в противном случае вы искусственно увеличивали бы (например) счетчик '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");
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...