Найти количество вхождений каждой цифры в строке - PullRequest
0 голосов
/ 09 февраля 2010

FYI. Еще одно упражнение, на котором я застрял. Задача состоит в том, чтобы найти количество вхождений каждой цифры в строке. Я чувствую, что я довольно близко, но я получаю некоторые странные результаты. Я новичок, поэтому, пожалуйста, держите подсказки / помощь на моем уровне, если это возможно. Спасибо!

Вот что у меня есть:

import java.util.Scanner;

    public class Practice5 {
 public static void main(String[] args) {
  Scanner input= new Scanner(System.in);
  System.out.println("Enter a string");
  String s = input.next();

  int[] counts = countNumbers(s);

  String output = "";

  for (int i = 0; i < counts.length; i++) {
   if (counts[i] != 0)
                        {
           output += "Digit" + (char)('0' + i) + " appears " +
           counts[i] + ((counts[i] == 1) + " times\n");
                        }

           }

                System.out.print(output);
           }


 private static int[] countNumbers(String s) {
  int[] counts = new int[10];

  for(int i = 0; i < s.length(); i++) {
   if (Character.isDigit(s.charAt(i)));
   counts[s.charAt(i) - '0']++;
  }
  return counts;
 }
}

Ok. Теперь, если я введу строку типа «23 t5t6 u76u 232 g1»

Я получаю:

2 appears 1 time
3 appears 1 time

Это явно неверно. Должно быть, 2 появляется 3 раза, 3 - 2 раза, 5 - 1 раз и т. Д. Любая помощь будет принята.

Ответы [ 6 ]

4 голосов
/ 09 февраля 2010

Ваша первая проблема связана с использованием сканера Java. Если я не ошибаюсь, вы читаете только первую подстроку до первого пробела. Вы, вероятно, хотели запустить всю строку, поэтому сканер не подходит для использования.

Как только вы получите всю строку, у вас все еще есть проблема. Основная проблема в вашем коде заключается в том, что в строке, которая читает

if (Character.isDigit(s.charAt(i)));

у вас точка с запятой в конце. В результате этого всегда выполняется следующая строка (где вы обновляете значения). Это проблема, потому что иногда ваш символ не будет цифрой, поэтому индекс «символ-'0» может выходить за пределы 10, который вы определили. Это должно быть поймано Java для создания исключения. Вы не видите это исключение, потому что ваш код будет обрабатывать только первые «23»

1 голос
/ 17 сентября 2016

Я дам вам еще один простой алгоритм, который я создал:

public class Ex95 {

    public static void main(String[] args) {
        int [] counts = count("1B2A2137455");
        for (int i = 0; i < counts.length; i++) {
            System.out.println("counts of [" + i + "] is: " + counts[i]);

        }

    }
    public static int[] count(String s){
        int [] counts = new int[10];
        char [] c = s.toCharArray();
        int counter = 0;
        for(int i=0;i<counts.length;i++){
            for(int j=0;j<c.length;j++){

                    if(Character.isDigit(c[j]) && i == Character.getNumericValue(c[j])){
                        counter++;

                }
            }
            counts[i] = counter;
            counter = 0;
        }
        return counts;
    }
}
1 голос
/ 09 февраля 2010

Это слишком долго для комментария, поэтому я добавил это в ответ, потому что я думаю, что это интересно и не обязательно хорошо известно.

Ради полноты следует отметить, что я могу ввести строку, которая приведет к сбою вашей программы. Вы назначаете int [], способный содержать 10 целых чисел, но вы должны знать, что среди символов Unicode гораздо больше, чем 10 цифр.

Итак, ваша программа выдаст ArrayIndexOutOfBoundsException для большого количества цифр.

Вы можете напечатать все символы, которые являются цифрами в соответствии с Character.isDigit (...), используя следующую программу (Character.isDigit (...) принимает целое число, поэтому мы зацикливаем все положительные числа): 1008 *

  for (int i = 0; i < Integer.MAX_VALUE; i++) {
    if (Character.isDigit(i)) System.out.println(i + ": " + (char) i);
  }

В моей версии Java это возвращает 268 таких цифр (фактическое количество цифр может варьироваться от одной версии Java к другой, в зависимости от фактической поддерживаемой версии Unicode).

Обратите внимание, что isDigit (...) принимает не символ, а целое число, представляющее кодовую точку Unicode.

48 is a digit: 0
49 is a digit: 1
50 is a digit: 2
51 is a digit: 3
52 is a digit: 4
53 is a digit: 5
54 is a digit: 6
55 is a digit: 7
56 is a digit: 8
57 is a digit: 9
1632 is a digit: ٠
1633 is a digit: ١
1634 is a digit: ٢
1635 is a digit: ٣
1636 is a digit: ٤
1637 is a digit: ٥
1638 is a digit: ٦
1639 is a digit: ٧
1640 is a digit: ٨
1641 is a digit: ٩
1776 is a digit: ۰
1777 is a digit: ۱
1778 is a digit: ۲
1779 is a digit: ۳
1780 is a digit: ۴
1781 is a digit: ۵
1782 is a digit: ۶
1783 is a digit: ۷
1784 is a digit: ۸
1785 is a digit: ۹
etc.
1 голос
/ 09 февраля 2010

В дополнение к дополнительной точке с запятой, которую упоминали другие, ваш ввод содержит пробелы (""), но вы читаете только первый набор символов до пробела. Вы можете использовать такую ​​строку, чтобы прочитать целую строку ввода вместо:

String s = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)).readLine();

Вам нужно будет либо использовать блок try / catch, либо добавить в ваш метод 'throws java.io.IOException'.

1 голос
/ 09 февраля 2010

удалить точку с запятой в конце этого оператора:

if (Character.isDigit(s.charAt(i)));

Ваш стиль кодирования вызывает у вас проблемы. Если вы примете некоторые разумные соглашения (например, согласованное целое, скобки вокруг ВСЕХ блоков, например, if / else и for), у вас не будет проблем с обнаружением этой ошибки.

0 голосов
/ 04 сентября 2016

Вы можете использовать приведенный ниже код для получения результатов вместо проверки функции Character.isDigit: -

public static void main(String[] args){
    int[] arr = {0,1,2,3,4,5,6,7,8,9};
    String str = "abc123456";
    HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();
    for (int i=0;i<10;i++){
        hm.put(arr[i], 0);
    }
    for (int i=0;i<str.length();i++){
        if(hm.containsKey(str.charAt(i) - '0')){
            hm.put(str.charAt(i) - '0', hm.get(str.charAt(i) - '0')+1);
        }
    }
    System.out.println(hm);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...