循环只读取最后一个值
问题描述:
我的程序中有一个错误,它使得我的循环只读取输入字符串的最后部分。我想让程序计算每个字符在字符串中的数量。我不想要答案告诉我如何更有效地存储这些值,而不重复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();
}
}
答
子字符串方法将从指定的索引返回一个新的字符串到字符串的末尾。你想要的是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();
}
}
你看过'substring'实际上做了什么吗? – immibis 2015-02-08 18:35:54
通过使用数组或HashMap和for循环,可以将此代码缩短95%。 –
2015-02-08 18:36:01
可能的重复[获取字符串索引 - Java](http://stackoverflow.com/questions/11229986/get-string-character-by-index-java) – immibis 2015-02-08 18:36:32