mixstring程序

时间:2014-11-23 15:19:35

标签: java

我编写了混合两个字符串的程序。例如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);
    }
}

5 个答案:

答案 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 s1s2长度不同时,您超出了数组的限制。要解决这个问题,请检查我是否超过2 Strings的限制。

if(i<a){
    ....
}
if(i<b) {
    ....
}

我已从您的代码中删除了j,并将循环条件更改为d<(a+b),因为可以在没有j的情况下完成。

CODE

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);

    }

}