для чтения цикла только последнее значение

1

В моей программе есть ошибка, которая заставляет мой цикл читать только последнюю часть введенной строки. Я хочу, чтобы программа подсчитывала, сколько из каждого символа находится в строке. Я не хочу, чтобы ответы говорили мне, как более эффективно хранить эти ценности, не повторяя всего 26 раз. Пожалуйста, ответьте на вопрос, который я сказал здесь. Извините, если это дубликат! Я просто не знаю, что указать, поскольку нет явной ошибки.

import java.util.Scanner;

public class stringprogram {
    public static void stringinputmethod()
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter a String");
        String strs = scan.nextLine();

        int numa = 0;
        int numb = 0;
        int numc = 0;
        int numd = 0;
        int nume = 0;
        int numf = 0;
        int numg = 0;
        int numh = 0;
        int numi = 0;
        int numj = 0;
        int numk = 0;
        int numl = 0;
        int numm = 0;
        int numn = 0;
        int numo = 0;
        int nump = 0;
        int numq = 0;
        int numr = 0;
        int nums = 0;
        int numt = 0;
        int numu = 0;
        int numv = 0;
        int numw = 0;
        int numx = 0;
        int numy = 0;
        int numz = 0;

        String randaf;

        for(int i=0; i<=strs.length();i++)
        {
            randaf = strs.substring(i);

            if(randaf.equals("a"))
            {
                numa = numa + 1;
            }
            else if(randaf.equals("b"))
            {
                numb = numb + 1;
            }
            else if(randaf.equals("c"))
            {
                numc = numc + 1;
            }
            else if(randaf.equals("d"))
            {
                numd = numd + 1;
            }
            else if(randaf.equals("e"))
            {
                nume = nume + 1;
            }
            else if(randaf.equals("f"))
            {
                numf = numf + 1;
            }
            else if(randaf.equals("g"))
            {
                numg = numg + 1;
            }
            else if(randaf.equals("h"))
            {
                numh = numh + 1;
            }
            else if(randaf.equals("i"))
            {
                numi = numi + 1;
            }
            else if(randaf.equals("j"))
            {
                numj = numj + 1;
            }
            else if(randaf.equals("k"))
            {
                numk = numk + 1;
            }
            else if(randaf.equals("l"))
            {
                numl = numl + 1;
            }
            else if(randaf.equals("m"))
            {
                numm = numm + 1;
            }
            else if(randaf.equals("n"))
            {
                numn = numn + 1;
            }
            else if(randaf.equals("o"))
            {
                numo = numo + 1;
            }
            else if(randaf.equals("p"))
            {
                nump = nump + 1;
            }
            else if(randaf.equals("q"))
            {
                numq = numq + 1;
            }
            else if(randaf.equals("r"))
            {
                numr = numr + 1;
            }
            else if(randaf.equals("s"))
            {
                nums = nums + 1;
            }
            else if(randaf.equals("t"))
            {
                numt = numt + 1;
            }
            else if(randaf.equals("u"))
            {
                numu = numu + 1;
            }
            else if(randaf.equals("v"))
            {
                numv = numv + 1;
            }
            else if(randaf.equals("w"))
            {
                numw = numw + 1;
            }
            else if(randaf.equals("x"))
            {
                numx = numx + 1;
            }
            else if(randaf.equals("y"))
            {
                numy = numy + 1;
            }
            else if(randaf.equals("z"))
            {
                numz = numz + 1;
            }
        }
        System.out.println("a: "+numa +"\nb: "+ numb +"\nc: "+ numc +"\nd: "+ numd +"\ne: "+ nume +"\nf: "+ numf +"\ng: "+ numg +"\nh: "+ numh +"\ni: "+ numi +"\nj: "+ numj +"\nk: "+ numk +"\nl: "+ numl +"\nm: "+ numm +"\nn: "+ numn +"\no: "+ numo +"\np: "+ nump +"\nq: "+ numq +"\nr: "+ numr +"\ns: "+ nums +"\nt: "+ numt +"\nu: "+ numu +"\nv: "+ numv +"\nw: "+ numw +"\nx: "+ numx +"\ny: "+ numy +"\nz: "+ numz);
    }

    public static void main(String[] args)
    {
        stringinputmethod();
    }
}
  • 3
    Вы смотрели, что на самом деле делает substring ?
  • 3
    Этот код можно сократить на 95% с помощью массива или HashMap<Charatcter, Integer> и цикла for.
Показать ещё 3 комментария
Теги:
string
for-loop

4 ответа

1

Метод substring возвращает новую строку из индекса, указанного в конце строки. То, что вы хотите, это String.charAt(index), который возвращает символ в указанном месте

1

substring возвращает часть строки из данного индекса в конец. Поскольку строка длиной более одного символа никогда не может быть равна одному символу, единственным местом, где выполняется какое-либо из условий, является последний символ. Вместо использования substring(i) вы можете использовать substring(i, i+1) или еще лучше, charAt(i) - просто обратите внимание, что она возвращает примитив char, а не объект java.lang.String.

Сказав это, вся эта конструкция немного громоздка. Было бы гораздо проще использовать Map<Character,Integer>:

// Initialization:
Map<Character,Integer> map = new HashMap<>();
for (char c = 'a'; c <= 'z'; ++c) {
    map.put (c, 0);
}

// Going over the string:
for(char c : strs.toCharArray()) {
    Integer i = map.get(c);
    if (i != 0) {
        map.put (c, i + 1);
    }
}

Или даже более оптимизированная форма может использовать массив, в котором первый элемент указывает число 'a', второе число 'b' и т. Д.:

// Initialization:
int[] chars = new int[26];
for (i = 0; i < chars.length; ++i) {
    chars[i] = 0;
}

// Going over the string:
for(char c : strs.toCharArray()) {
    int i = c - 'a';
    if (i >= 0 && i < chars.length) {
        chars[i]++;
    }
}
0
 randaf = strs.substring(i);

Измените эту строку на

randaf = strs.substring(i,i+1);

И измените цикл for на i<strs.length() и не равны.

Если вы хотите сократить программу, вы можете это сделать.

int[] counts=new int[26];

for(int i=0;i<strs.length();i++)
counts[strs.charAt(i)-'a']++;

Предполагая, что вы хотите только сосчитать 'a' на 'z'

-1

Хорошо, поэтому я получил это сразу после того, как я разместил это. Спасибо за помощь в любом случае! Я просто изменил диапазон моей substring чтобы прочитать один символ, а не все после него.

Я все еще не исправил проблему с моим длинным кодом, но, эй, это работает.

import java.util.Scanner;

public class stringprogram {
    public static void stringinputmethod()
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter a String");
        String strs = scan.nextLine();

        int numa = 0;
        int numb = 0;
        int numc = 0;
        int numd = 0;
        int nume = 0;
        int numf = 0;
        int numg = 0;
        int numh = 0;
        int numi = 0;
        int numj = 0;
        int numk = 0;
        int numl = 0;
        int numm = 0;
        int numn = 0;
        int numo = 0;
        int nump = 0;
        int numq = 0;
        int numr = 0;
        int nums = 0;
        int numt = 0;
        int numu = 0;
        int numv = 0;
        int numw = 0;
        int numx = 0;
        int numy = 0;
        int numz = 0;

        String randaf;

        for(int i=0; i<=strs.length()-1;i++)
        {
            randaf = strs.substring(i, i+1);

            if(randaf.equals("a"))
            {
                numa = numa + 1;
            }
            else if(randaf.equals("b"))
            {
                numb = numb + 1;
            }
            else if(randaf.equals("c"))
            {
                numc = numc + 1;
            }
            else if(randaf.equals("d"))
            {
                numd = numd + 1;
            }
            else if(randaf.equals("e"))
            {
                nume = nume + 1;
            }
            else if(randaf.equals("f"))
            {
                numf = numf + 1;
            }
            else if(randaf.equals("g"))
            {
                numg = numg + 1;
            }
            else if(randaf.equals("h"))
            {
                numh = numh + 1;
            }
            else if(randaf.equals("i"))
            {
                numi = numi + 1;
            }
            else if(randaf.equals("j"))
            {
                numj = numj + 1;
            }
            else if(randaf.equals("k"))
            {
                numk = numk + 1;
            }
            else if(randaf.equals("l"))
            {
                numl = numl + 1;
            }
            else if(randaf.equals("m"))
            {
                numm = numm + 1;
            }
            else if(randaf.equals("n"))
            {
                numn = numn + 1;
            }
            else if(randaf.equals("o"))
            {
                numo = numo + 1;
            }
            else if(randaf.equals("p"))
            {
                nump = nump + 1;
            }
            else if(randaf.equals("q"))
            {
                numq = numq + 1;
            }
            else if(randaf.equals("r"))
            {
                numr = numr + 1;
            }
            else if(randaf.equals("s"))
            {
                nums = nums + 1;
            }
            else if(randaf.equals("t"))
            {
                numt = numt + 1;
            }
            else if(randaf.equals("u"))
            {
                numu = numu + 1;
            }
            else if(randaf.equals("v"))
            {
                numv = numv + 1;
            }
            else if(randaf.equals("w"))
            {
                numw = numw + 1;
            }
            else if(randaf.equals("x"))
            {
                numx = numx + 1;
            }
            else if(randaf.equals("y"))
            {
                numy = numy + 1;
            }
            else if(randaf.equals("z"))
            {
                numz = numz + 1;
            }
        }
        System.out.println("a: "+numa +"\nb: "+ numb +"\nc: "+ numc +"\nd: "+ numd +"\ne: "+ nume +"\nf: "+ numf +"\ng: "+ numg +"\nh: "+ numh +"\ni: "+ numi +"\nj: "+ numj +"\nk: "+ numk +"\nl: "+ numl +"\nm: "+ numm +"\nn: "+ numn +"\no: "+ numo +"\np: "+ nump +"\nq: "+ numq +"\nr: "+ numr +"\ns: "+ nums +"\nt: "+ numt +"\nu: "+ numu +"\nv: "+ numv +"\nw: "+ numw +"\nx: "+ numx +"\ny: "+ numy +"\nz: "+ numz);
    }

    public static void main(String[] args)
    {
        stringinputmethod();
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню