0

私はTSP問題の解決に取り組んでいます。「123456」のすべての順列を生成しましたが、これを次のようなものStringに変換する必要があります[1,2,3,4,5,6] ...[6,5,4,3,2 、1]。次に、これをのに保存します。そこに着いたら、旅行する必要のあるすべての都市を比較できるようになります。ArrayListIntegerArrayListArrayLists

コードを実行すると、順列を生成するメソッドがあり、次にその順列をのに変更するメソッドがArrayListありIntegerます。それらを変換すると、例外が発生しますjava.lang.NumberFormatException: For input string: ""String私はに到達する他の方法を知りませんInteger

これが私のコードです。

public static String permute(String begin, String string){
    if(string.length() == 0){
        stringToIntArray(begin+string);
        return begin + string + " ";

    }
    else{
        String result = "";
        for(int i = 0; i < string.length(); ++i){
            String newString = string.substring(0, i)  + string.substring(i+1, string.length());;
            result += permute(begin + string.charAt(i), newString);
        }
        stringToIntArray(result);
        return result;


    }
}

public static void stringToIntArray(String s){
    ArrayList<Integer> perm = new ArrayList<Integer>();
    String [] change = s.split("");
    for(int i = 0; i < 7; ++i){
        int integer = Integer.parseInt(change[i]);
        System.out.println(integer);
    }

}

public static void main(String[] args) {
    permute("", "123456");
} 
4

2 に答える 2

1

これらの行

String [] change = s.split("");
for(int i = 0; i < 7; ++i){
    int integer = Integer.parseInt(change[i]);
    System.out.println(integer);
}

「12345」のようなものを与えて、Stringそれを何も分割しないと、すべての文字が分離されます。で配列を提供し["","1","2","3","4","5"]ます。空String ""は数値ではないため、NumberFormatException. 最初の空の を無視するために、インデックスiを at から開始するように変更できます。1String

于 2013-03-22T18:43:14.463 に答える
0

このsplitメソッドは、 で分割する""と、配列の最初の要素として空の文字列が生成されるため、i = 1 から反復を開始する必要があります。

また、反復を で停止してchange.length、6 文字を超える場合はすべての文字を処理し、少ない場合は範囲​​外にならないようにする方が安全です。

String [] change = s.split("");
for(int i = 1; i < change.length; ++i){ // ignore first element
    int integer = Integer.parseInt(change[i]);
    System.out.println(integer);
}
于 2013-03-22T18:43:38.927 に答える