To jest kod, na którym pracuję. Nie wiem, gdzie idę źle.

package mcdcpairwise;
import java.io.*;
import java.util.*;

public class Permutation
{
    public static void main(String[] args)
    {
        String a="000";
        String b="|&";

        for (int i=0; i < a.length(); i++){
            if (i % 2 != 0){
                a = a.substring(0,i-1) + b.substring(0,i-1). + a.substring(i, a.length()) + b.substring(i, b.length());
                System.out.println(a);
            }
        }

    }
}    

Błąd, w jakim stoję, to:

Wyjątek w wątku "Main" java.lang.stringindexoutofboundSexception: String Indeks poza zasięgiem: -2 w java.lang.string.substring (string.jawa:1967) w McDcpaiWise.PerMata.main (permutacja)

Wyjście powinno być:

0 | 0 i 0

0
Averty micc 5 czerwiec 2018, 06:14

4 odpowiedzi

Najlepsza odpowiedź

Z twojego pytania nie jest jasne, jakie są twoje "zasady" do przetworzenia. Wydaje się jednak, że twoje wyjście po prostu wkłada znak między każdym znakiem źródłowym a ciąg.

Zamiast używać podciągu, utwórz osobny StringBuilder, aby dodać indywidualne znaki do. Poniższy kod wytwarza wyjście, które szukasz:

String string = "000";
StringBuilder output = new StringBuilder();

for (int i = 0; i < string.length(); i++) {

    // Get current character in the string
    char c = string.charAt(i);

    // Add the current character to the output
    output.append(c);

    // If more characters exist, add the pipe
    if (i != string.length() - 1) {
        output.append("|");
    }
}

System.out.println(output.toString());
0
Zephyr 5 czerwiec 2018, 04:48

Prawy kod powinien być a.substring(0,i).

0
VienNguyen 5 czerwiec 2018, 04:04

Możesz użyć String.toCharArray, aby uzyskać char[] z String. W ten sposób możemy łatwiej wędrować łatwiej niż String za pomocą indeksu.

String a="000";
String b="|&";

char[] arrayA = a.toCharArray();
char[] arrayB = b.toCharArray();

Następnie, co musimy zrobić, to scalić dwie tablicę (z {x0}} s), biorąc jeden znak z obu. Dodawanie dwóch warunków (jeden na tablicę), aby zapobiec każdej arrayindexoutofboundSexception, możemy zapewnić, że scalamy dwie tablice.

StringBuilder sb = new StringBuilder();

//Add a char from both array (until we reach on of the limit)
int i = 0;
while( i < arrayA.length && i < arrayB.length){
    sb.append(arrayA[i]).append(arrayB[i]);
    ++i;
}

Wtedy wystarczy dodać pozostałe znaki za pomocą pętli for w obu macierzy. Tylko jedna z tych pętli zostanie wyzwolona (lub brak) od co najmniej jednego poprzedniego warunku ({x1}}) jest już false.

//Add the rest of `a` if any
for(int j = i; j < arrayA.length; ++j){
    sb.append(arrayA[j]);
}

//Add the rest of `b` if any
for(int j = i; j < arrayB.length; ++j){
    sb.append(arrayB[j]);
}

System.out.println(sb.toString());

0 | 0 i 0

0
AxelH 5 czerwiec 2018, 05:40

Oto rozwiązanie jednego linii:

System.out.println((a + b).replaceAll("(?<=.)(?=.{" + (a.length() - 1) + "}(.))|.(?=.{0," + (b.length() - 1) + "}$)", "$1"));

Działa to ze wszystkimi kombinacjami nielegowych ciągów początkowych.

Zobacz Demo na żywo.

0
Bohemian 5 czerwiec 2018, 06:05