2015-02-08 2 views
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

Вы искали то, что на самом деле делает подстрока? – immibis

+3

Этот код можно сократить на 95% с помощью массива или 'HashMap ' и для цикла. –

+0

Возможный дубликат [Получить строковый символ по индексу - Java] (http://stackoverflow.com/questions/11229986/get-string-character-by-index-java) – immibis

ответ

1

Метод подстроки возвращает новую строку из индекса, указанного в конце строки. Вы хотите, чтобы 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']++; 

Предполагая, что вы только хотите считать «а» до «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(); 
    } 
}