我的任务是编写一个方法,该方法应该组合连续出现两次以上的字母。示例:ABBCCCDDDD - > ABBC3D4
我被告知我们库的In.java和Out.java用于输入和输出。我的问题是该方法跳过for循环。我希望你能帮助我。如果您对代码有任何疑问,请问我
public class Aufgabe9_4 {
static void codieren(String s){
int Zähler = 0;
char[] a = s.toUpperCase().toCharArray();
for (int i = 0; i<s.length()-1; i++){
if (a[i] == a[i+1] && a[i] ==a[i+2]){
Zähler = 3;
while (a[i] == a[i+Zähler]) Zähler++;
i = i + Zähler;
}
Out.println(a[i] + Zähler);
}
}
public static void main(String args[]) {
Out.println("Geben sie eine Reihenfolge von Buchstaben ein!");
String s = In.readString();
Out.println("Die Codierung lautet:");
codieren(s);
}
}
答案 0 :(得分:2)
我已更正代码并获得了您期望的结果:ABBC3D4
所有数组访问都必须在数组范围内。当您访问[i+2]
时,请确保i
值始终为< length-2
。 (换句话说,您要访问的索引(i+2
)必须始终为< length
。)
使用 while 循环时,它有点棘手,因为[i+Zähler]
也必须是< length
,但Zähler
可以是任何值。为此,我添加了(i+Zähler) < s.length()
作为支票。它必须在a[i] == a[i+Zähler]
之前,因为它需要首先进行评估。
您的原始代码也是如此:i = i + Zähler
。你超过1,所以我不得不添加- 1
。通过否定最后 print(a[i])
的影响,确保Zähler++
不会失败。
println(a[i] + Zähler)
将打印a[i]
添加Zähler
的数字和( char 值为整数> )。显然这不是你想要的,所以我把它分开了。
我还添加了支票if (Zähler != 0)
,因为您不希望打印零。
print
函数代替println
,打印在同一行。
我在下面的代码中没有解决的问题:当您在for循环中访问数组时,循环参数应该更好地使用相同数组的长度。因此,您应该使用a.length
,而不是s.length()
。
其他内容:尝试使用String.charAt()
重写程序。
工作程序位于Ideone here (link)。
static void codieren(String s){
int Zähler = 0;
char[] a = s.toUpperCase().toCharArray();
for (int i = 0; i<s.length()-2; i++){
if (a[i] == a[i+1] && a[i] ==a[i+2]){
Zähler = 3;
while ((i+Zähler) < s.length() && a[i] == a[i+Zähler]) {
Zähler++;
}
i = i + Zähler - 1;
}
System.out.print(a[i]);
if (Zähler != 0) {
System.out.print(String.valueOf(Zähler));
}
}
}
答案 1 :(得分:1)
这是一个评论,但我需要包含格式化的输出和代码。
我认为问题可能是程序因异常而失败,输出方法没有显示异常的先前输出。
我使用System.out.println在一个基于问题源代码的程序中输出,得到了:
65
66
66
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at Test.codieren(Test.java:8)
at Test.main(Test.java:18)
71
ArrayIndexOutOfBoundsException表示您尝试使用不存在的索引(在本例中为10)使用0到length-1范围之外的索引访问数组。
我修改的程序是:
public class Test {
static void codieren(String s) {
int Zähler = 0;
char[] a = s.toUpperCase().toCharArray();
for (int i = 0; i <= s.length() - 1; i++) {
if (a[i] == a[i + 1] && a[i] == a[i + 2]) {
Zähler = 3;
while (a[i] == a[i + Zähler])
Zähler++;
i = i + Zähler;
}
System.out.println(a[i] + Zähler);
}
}
public static void main(String args[]) {
String s = "abbcccdddd";
codieren(s);
}
}
答案 2 :(得分:1)
您的print语句打印下一个char而不是打印当前的char。 你必须:
所以这就是你的方法应该是这样的:
static void codieren(String s){
char[] a = s.toUpperCase().toCharArray();
for (int i = 0; i<s.length()-1; i++){
int Zähler = 1;
Out.print(a[i]);
if (a[i] == a[i+1] && a[i] ==a[i+2]){
Zähler = 3;
while (a[i] == a[i+Zähler]) Zähler++;
i = i + Zähler;
}
Out.println("(" + Zähler + ")");
}
}
答案 3 :(得分:1)
我首先编写一个例程来计算数组中字符的连续出现次数,
private static int countOccur(char[] arr, int st, int end) {
final char ch = arr[st]; // 'st' is start.
int count = 1;
for (; count < end - st; count++) { // <-- don't exceed the array boundary
if (ch != arr[st + count]) { // <-- break if not the same character
break;
}
}
return count; // <-- return the count
}
接下来,我修改codieren(String)
以返回String
(而不是void
,让调用者显示结果 - 例如关注点分离),
static String codieren(String s) {
if (s == null) { // <-- handle corner cases.
return null;
}
StringBuilder sb = new StringBuilder(); // <-- for building the return String.
char[] a = s.toUpperCase().toCharArray();
for (int i = 0; i < a.length;) { // <-- we will increment by occurrences.
int occur = countOccur(a, i, a.length); // <-- get the occurrences count.
if (occur > 2) { // <-- 3 or more are LETTER then COUNT.
sb.append(a[i]).append(occur);
} else { // <-- Must be 2 or fewer.
for (int t = 0; t < occur; t++) {
sb.append(a[i]);
}
}
i += occur; // <-- increment 'i'.
}
return sb.toString(); // <-- return the result.
}
答案 4 :(得分:1)
这是一种使用&#34; lookback&#34;的替代算法。哪个恕我直言更容易维护(长度截止不是回顾算法中扫描阶段的一部分)。
步骤:
这将工作分成两部分......&#34;扫描边缘&#34;和&#34;代表最后一个序列&#34;它可以以模块化方式编码。
public static String getCollapsed(String inString) {
char[] chars = inString.toUpperCase().toCharArray();
StringBuilder sb = new StringBuilder(inString.length());
char curChar = ' ';
char lastChar = ' ';
int lastCount = 0;
for (int i = 0; i < chars.length; i++) {
curChar = chars[i];
if (i != 0) {
if (curChar != lastChar) {
sb.append(getRepresentation(lastChar, lastCount));
lastCount = 0;
}
}
lastChar = curChar;
lastCount++;
}
sb.append(getRepresentation(lastChar, lastCount));
return sb.toString();
}
private static String getRepresentation(char c, int count) {
String s = "";
if (count == 1) s = "" + c;
else if (count == 2) s = "" + c + c;
else s = "" + c + count;
return s;
}
public static void main(String[] args) {
System.out.println(getCollapsed("AAAABCCDDDD"));
}
答案 5 :(得分:1)
如何使用两个
i = 0;
counter = 0;
currentchar=s[0]
stringbuffer outputstr;
while i < s.length
{
while s[i]==currentchar and i < s.length
{
counter +=1;
i+=1;
}
if (counter== 1)
{ outputstr.append(currentchar); }
elseif (counter==2)
{ outputstr.append(currentchar);
outputstr.append(currentchar);
}
else
{ outputstr.append(currentchar);
outputstr.append(counter.toString);
}
currentchar = s[i];
counter = 0;
}