1

string の可能なすべての部分文字列を生成する次のコードがあります。

import java.util.*;
public class PlayString
{
    public static void main(String[] args)
    {
        String st = "ABC";
        char[] arr = new char[st.length()];
        for (int x = 0; x < st.length(); x++)
        {
            arr[x] = st.charAt(x);
        }
        StringBuffer sb = new StringBuffer();
        combination(arr, 0, st.length() - 1, sb);
    }

    public static void combination(char[] arr, int index, int b, StringBuffer sb)
    {
        for (int i = index; i <= b; i++)
        {
            sb.append(arr[i]);
            System.out.println(sb);
            combination(arr, i + 1, b, sb);
            sb.setLength(sb.length() - 1);
        }
    }
}

私の質問は次のとおりです。最後の行で sb.setLength(sb.length()-1) の場合、正確には何が起こりますか? たとえば、文字列入力が「abc」の場合、出力は a 、 ab 、 abc のようになります。長さが設定されるとどうなりますか? それが設定された後、切り捨てられたものはありますか?その後に要素を追加しようとするとどうなりますか?

つまり、入力文字列が「abc」の場合、文字列バッファーに「abc」が含まれ、その長さが 3 になった後、 sb.setLength(sb.length() - 1 ) を実行するため、長さは now になります。どの要素が正確に切り捨てられますか? 後で追加するとどうなるでしょうか。

4

1 に答える 1

1

関数の組み合わせ()を次のように置き換えると

public static void combination(char[] arr, int index, int b, StringBuffer sb)
    {
        for (int i = index; i <= b; i++)
        {
            System.out.println("i :" + i);
            sb.append(arr[i]);
            System.out.println(sb);
            combination(arr, i + 1, b, sb);
            System.out.println("setting length:" + (sb.length() -1) + ": index :" + index);
            sb.setLength(sb.length() - 1);
        }
    }

次の出力が表示されます >

i :0
A
i :1
AB
i :2
ABC
setting length:2: index :2
setting length:1: index :1
i :2
AC
setting length:1: index :1
setting length:0: index :0
i :1
B
i :2
BC
setting length:1: index :2
setting length:0: index :0
i :2
C
setting length:0: index :0

理由が説明されていることを願っています。

于 2012-09-18T18:19:53.777 に答える