循环只读取最后一个值

问题描述:

我的程序中有一个错误,它使得我的循环只读取输入字符串的最后部分。我想让程序计算每个字符在字符串中的数量。我不想要答案告诉我如何更有效地存储这些值,而不重复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

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

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]++; 
    } 
} 

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”

好了,我知道了。不过感谢您的帮助!我只是改变了我的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(); 
    } 
}