我是Java新手。我正在尝试打印字符串中存在的字符及其计数。仅当旁边有相同字符时,计数才会增加。
例如:
I / O:Sssgs
O / P:S1s2g1s1
对每个字符的出现进行计数将得出全部计数的计数,而与相邻字符不存在无关。篡改i和j循环会出现OutOfBounds错误。
//ch[] is the String converted to a character array.
//count[] is an array to store count of the characters
//Checks if present char and next char are same and increments count
for(int i=0;i<ch.length;i++)
{
count[i]=0;
for(int j=0;j<ch.length;j++)
{
if(ch[i]==ch[j])
{
count[i]++;
}
}
}
//Prints Distinct char
for(int i=0;i<ch.length;i++)
{
int j;
for(j=0;j<i;j++)
{
if(ch[i]==ch[j])
{
break;
}
}
if(i==j)
{
System.out.print(ch[i]+" "+count[i]);
}
}
输入的是> HelloWorld
预期输出应为> H1 e1 l2 o1 W1 o1 r1 l1 d1
答案 0 :(得分:1)
我刚刚在您的代码中做了一些更正,下面是它的样子:
public static void main(String[] args) {
String s = "Sssgs";
char[] ch = s.toCharArray();
int[] count = new int[20];
for(int i=0;i<ch.length;i++)
{
count[i]=0;
for(int j=i;j<ch.length;j++)
{
if(ch[i]==ch[j])
{
count[i]++;
} else {
break;
}
}
}
//Prints Distinct char
for(int i=0;i<ch.length;i += count[i])
{
System.out.print(ch[i] + "" +count[i]);
}
}
当我仅读取字符及其出现次数,然后在迭代中跳过该数目时,大多数更改都在“打印区别”中。它让我停在下一个不同的字符上
“ Sssgs”的输出为“ S1s2g1s1”,“ HelloWorld”的输出为“ H1e1l2o1W1o1r1l1d1”
答案 1 :(得分:1)
这是一个简单的解决方案,它不使用任何额外的数组,而是在下一个字符不同时直接打印计数的字符
char prevChar = ch[0];
int count = 1;
for (int i = 1; i < ch.length; i++) {
if (ch[i] != prevChar) {
System.out.printf("%c%d ", prevChar, count);
count = 1;
prevChar = ch[i];
} else {
count++;
}
}
System.out.printf("%c%d ", prevChar, count);
答案 2 :(得分:0)
我讨厌这种解决方案,但是我猜您由于需要而使用char []。如果不是强制性的,我建议您按照Lino的建议使用StringBuilder
。
char blankChar = " ".charAt(0);
if (stringInput == null || "".equals(stringInput)) {
System.out.println("Empty input");
}
char[] ch = stringInput.toCharArray();
char lastChar = ch[0];
int numAppearanceslastChar = 0;
for (char element : ch) {
if (element == blankChar) {
continue;
}
if (lastChar == element) {
numAppearanceslastChar++;
} else {
System.out.print(lastChar+""+numAppearanceslastChar+" ");
lastChar = element;
numAppearanceslastChar = 1;
}
}
System.out.println(lastChar+""+numAppearanceslastChar+" ");
输出:H1 e1 l2 o1 w1 o1 r1 l1 d1
说明:仅读取整个单词一次(请注意,您将执行一次for循环3次),并将最近读取的char与新的char进行比较。如果它们匹配,则增加该字符的出现次数。如果不是,则打印它们并将新的字符设置为最后读取的字符。 当您结束阅读单词时,请打印最后阅读的字符。
始终记住保持简单!并进行消毒(如果收到null或空值,则在此代码中将得到一个nullPointer,只需将其写在那里指出即可)。
答案 3 :(得分:0)
我想到了这个
public static String count(String in) {
if (in == null || in.isEmpty()) {
return in;
}
int length = in.length();
if (length == 1) {
return in + '1';
}
StringBuilder out = new StringBuilder(length << 1);
char previous = in.charAt(0);
int count = 1;
for (int i = 1; i < length; i++) {
char current = in.charAt(i);
if (previous == current) {
count++;
} else {
out.append(previous).append(count);
previous = current;
count = 1;
}
}
return out.append(previous).append(count).toString();
}
注意空字符串和空字符串。还有带有length == 1
(只是string + 1
)的字符串。
该解决方案也不需要创建额外的char[]
数组,因为它可以与charAt
一起使用