2015-02-08 177 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

你看過'substring'實際上做了什麼嗎? – immibis 2015-02-08 18:35:54

+3

通過使用數組或HashMap 和for循環,可以將此代碼縮短95%。 – 2015-02-08 18:36:01

+0

可能的重複[獲取字符串索引 - Java](http://stackoverflow.com/questions/11229986/get-string-character-by-index-java) – immibis 2015-02-08 18:36:32

回答

1

子字符串方法將從指定的索引返回一個新的字符串到字符串的末尾。你想要的是String.charAt(index),它將返回指定位置的字符

1

substring返回從給定索引到它結束的字符串部分。由於長於單個字符的字符串永遠不能等於單個字符,因此滿足任何條件的唯一地方是最後一個字符。您可以使用substring(i, i+1)或更好的charAt(i),而不是使用substring(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' S中的數量,'b' S中的第二數量,等:

// 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(); 
    } 
} 
相關問題