我编写了混合两个字符串的程序。例如string1 =hi
string2=there
输出htihere
但我得到java.lang.StringIndexOutOfBoundsException
。
import java.util.*;
public class Test2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str,str1;
System.out.println("Enter two strings");
str=scan.nextLine();
str1=scan.nextLine();
mixString(str,str1);
}
private static void mixString(String str,String str1) {
String s1,s2;
s1=str;
s2=str1;
int a,b;
a=s1.length();
b=s2.length();
char[] ch = new char[a+b];
int d=0;
for(int i=0,j=0;i+j<(a+b);i++,j++) {
ch[d]=s1.charAt(i);d++;
ch[d]=s2.charAt(j);d++;
}
System.out.println(ch);
}
}
答案 0 :(得分:1)
主要问题出在for
循环中:
for(int i = 0,j = 0; i + j&lt;(a + b); i ++,j ++){ CH [d] = s1.charAt(ⅰ); d ++; CH [d] = s2.charAt(J); d ++; }
我们的情况应该更像这样:
int i=0,j=0,d=0;
for (; i < a && j < b; ++i,++j)
这确保只要两个字符串都有字母可用,我们就只循环组合代码。
我们需要声明迭代变量,因此它们的作用域在此循环之外,因此我们可以继续使用较长的字符串停止:
int i=0,j=0,d=0;
for (; i < a && j < b; ++i,++j) {
ch[d] = s1.charAt(i); ++d;
ch[d] = s2.charAt(j); ++d;
}
for (; i < a; ++i) {
ch[d] = s1.charAt(i);
++d;
}
for (; j < b; ++j) {
ch[d] = s2.charAt(j);
++d;
}
这两个循环需要在第一个组合字符的循环之后。最多只能执行这两个循环中的一个循环,因为第一个循环的完成保证了这两个循环之一的条件已经返回false
。
答案 1 :(得分:1)
您的代码问题是当Strings
s1
和s2
长度不同时,您超出了数组的限制。要解决这个问题,请检查我是否超过2 Strings
的限制。
if(i<a){
....
}
if(i<b) {
....
}
我已从您的代码中删除了j
,并将循环条件更改为d<(a+b)
,因为可以在没有j
的情况下完成。
for(int i=0,d=0;d<(a+b);i++) {
if(i<a){
ch[d]=s1.charAt(i);d++;
}
if(i<b) {
ch[d]=s2.charAt(i);d++;
}
}
答案 2 :(得分:0)
这是另一种方法:
public static void main(String[] args)
{
System.out.println(mixString("hi", "there"));
}
private static String mixString(String s1, String s2) {
// String writer is good here to avoid dealing directly with a char array
StringWriter result = new StringWriter();
// Only loop for the min length
int minLength = Math.min(s1.length(), s2.length());
for ( int i = 0; i < minLength; i++) {
result.append(s1.charAt(i));
result.append(s2.charAt(i));
}
// Add the remaining text of the longest string
String stringWithMaxLength = s1.length() > s2.length() ? s1 : s2;
result.append(stringWithMaxLength.substring(minLength));
return result.toString();
}
不要忘记导入java.io.StringWriter。您也可以使用StringBuilder。
答案 3 :(得分:0)
好的尝试这段代码,在我的最后工作正常:
String str = "hellozzz";
String str1 = "dude";
int count1=0,count2=0;
char c[] = new char[str.length()+str1.length()];
for(int i=0;i<c.length;i++)
{
if((i%2==0 && count1<str.length()) || (i%2==1 && count2>=str1.length()))
{
c[i]=str.charAt(count1);
count1++;
}
else if((i%2==1 && count2<str1.length()) || (i%2==0 && count1>=str.length()))
{
c[i]=str1.charAt(count2);
count2++;
}
}
System.out.println(Arrays.toString(c));
它将从上面定义的字符串开始拾取,它不管是哪个字符串更大或更小,它会完美地混合
答案 4 :(得分:-1)
import java.util.Scanner;
public class MixString {
public static void main(String[] args)
{
String s1,s2;
Scanner s = new Scanner(System.in);
System.out.println("Enter 2 strings");
s1 = s.nextLine();
s2 = s.nextLine();
mixString(s1,s2);
}
private static void mixString(String s1, String s2)
{
int a,b;
a = s1.length();
b = s2.length();
char[] c = new char[a+b];
int d = 0;
for(int i=0,j=0;i+j<=(a+b+1);i++,j++)
{
try {
if(i<a)
{
c[d] = s1.charAt(i);
d++;
}
c[d] = s2.charAt(j);d++;
} catch (StringIndexOutOfBoundsException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(c);
}
}