

java.lang.IndexOutOfBoundsException、このエラーの意味はわかりますがなぜbが3回出力されaが2回出力されるのかわかりません  
どなたか教えてください

[code]

    public class KString extends Object{
    
    
        ArrayList<Character> kList = new ArrayList<Character>();
    
        public KString(char[] c) {
            kList.clear();
            for(int i = 0; i < c.length; i++) {
                kList.add(i,c[i]);
            }
        }
        
        
        
        public KString[] split(char c) {
            
            char split = c;
            ArrayList<Integer> array = new ArrayList<Integer>();
            
            for(int i = 0, j = 0; i < kList.size(); i++) {
                if(kList.get(i).equals(split)) {
                    array.add(j,i);
                    j++;
                }
            }
            int k = 0;
            char[] vc = new char[array.get(0)];
            KString[] ks = new KString[array.size()];
            for(int i = 0; i < kList.size(); i++) {
                if(kList.get(i).equals(split)) {
                    ks[k] = new KString(vc);
                    if((i == array.get(k))) {
                        System.out.println("a");
                        vc = new char[((array.get(k+1))-(array.get(k)+1))];
                    }
                    k++;
                }else{
                    if(k==0) {
                        vc[i-k] = kList.get(i);
                        System.out.println("b");
                    }else{
                        vc[((i-1)-(array.get(k-1)))] = kList.get(i);
                    }
                }
            }
            return ks;
        }
    }
    
    public class Next {
    
        public static void main(String[] args) {
            char[] c = new char[]{'a','b','c',',','d','e','f',',','g','h','i'};
            KString ks = new KString(c);
            ks.split(',');
        }
    }
    
[/code]

結果

[code]

    b
    b
    b
    a
    a
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 2 out of bounds for length 2
        at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
        at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
        at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
        at java.base/java.util.Objects.checkIndex(Objects.java:372)
        at java.base/java.util.ArrayList.get(ArrayList.java:459)
        at ABC.KawaiString.split(KawaiString.java:57)
        at ABC.Next.main(Next.java:8)
    
[/code]


CC BY-SA 4.0
2022-04-16T03:58:31.987
88353
2022-04-16T07:10:35.480
2022-04-16T06:14:01.957
3060
52034
question
java string
Stringのsplitクラスをつくりたい


  1. 1~3番目の文字('a','b','c')はsplitと不一致で、かつk=0の為(k++を通る事が無い)  
bが3回出力されます。

  2. 4番目(',')は一致するので、aが出力されます。  
(i == array.get(k)は、必ずtrueになると思います)

  3. 5~7番目('d','e','f')は不一致の為、elseに入りますが  
k==0ではない為、何も出力されません。

  4. 8番目(',')は一致のため、aが出力されますが  
その後のarray.get(k+1)で例外に落ちます

分かりやすいよう、ログを追加してみました  
("c"が上記「3.」に該当するパターンです)

[code]

        public KString[] split(char c) {
            
            char split = c;
            ArrayList<Integer> array = new ArrayList<Integer>();
            
            for(int i = 0, j = 0; i < kList.size(); i++) {
                if(kList.get(i).equals(split)) {
                    array.add(j,i);
                    j++;
                }
            }
            int k = 0;
            char[] vc = new char[array.get(0)];
            KString[] ks = new KString[array.size()];
            for(int i = 0; i < kList.size(); i++) {
                System.out.println("Cur Char:"+kList.get(i).toString());//add
                if(kList.get(i).equals(split)) {
                    ks[k] = new KString(vc);
                    if((i == array.get(k))) {
                        System.out.println("a");
                        vc = new char[((array.get(k+1))-(array.get(k)+1))];
                    }
                    k++;
                }else{
                    if(k==0) {
                        vc[i-k] = kList.get(i);
                        System.out.println("b");
                    }else{
                        vc[((i-1)-(array.get(k-1)))] = kList.get(i);
                        System.out.println("c");//add
                    }
                }
            }
            return ks;
        }
    
[/code]

結果は以下になります

[code]

    Cur Char:a
    b
    Cur Char:b
    b
    Cur Char:c
    b
    Cur Char:,
    a
    Cur Char:d
    c
    Cur Char:e
    c
    Cur Char:f
    c
    Cur Char:,
    a
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 2 out of bounds for length 2
        at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
        at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
        at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
        at java.base/java.util.Objects.checkIndex(Objects.java:359)
        at java.base/java.util.ArrayList.get(ArrayList.java:427)
        at KString.split(prog.java:36)
        at prog.main(prog.java:58)
    
[/code]


CC BY-SA 4.0
2022-04-16T07:10:35.480
88354
2022-04-16T07:10:35.480
24599
88353
answer