13

文字列を整数の配列に変換して、それらに対して数学演算を実行できるようにしようとしています。次のコードで問題が発生しています。

String raw = "1233983543587325318";

char[] list = new char[raw.length()];
list = raw.toCharArray();
int[] num = new int[raw.length()];

for (int i = 0; i < raw.length(); i++){
    num[i] = (int[])list[i];
}

System.out.println(num);

これにより、「変換不可能な型」エラーが発生します。必須:int [] found:char Character.getNumericValueなどの他の方法も試し、変更せずに直接割り当てました。そのような状況では、使用する変換方法や(!)文字列の実際の値に関係なく、常に同じガベージ "[I@41ed8741"]を出力します。それはUnicode変換と関係がありますか?

4

12 に答える 12

14

ソリューションには多くの問題があります。1 つ目は、ループ条件i > raw.length()が間違っていることです。ループは実行されません。条件は次のようにする必要があります。i < raw.length()

2つ目はキャスト。整数配列にキャストしようとしています。実際、結果は char であるため、int にキャストする必要はありません。変換は自動的に行われます。しかし、変換された数値は、あなたが思っているものではありません。期待する整数値ではありませんが、実際には char の ASCII 値です。したがって、期待する整数値を取得するには、ASCII 値のゼロを減算する必要があります。

3 番目は、結果の整数配列を出力しようとしている方法です。配列の各要素をループして出力する必要があります。

    String raw = "1233983543587325318";

    int[] num = new int[raw.length()];

    for (int i = 0; i < raw.length(); i++){
        num[i] = raw.charAt(i) - '0';
    }

    for (int i : num) {
        System.out.println(i);
    }
于 2012-06-04T18:24:28.467 に答える
12

Java 8 の 2 つの方法:

String raw = "1233983543587325318";

final int[] ints1 = raw.chars()
    .map(x -> x - '0')
    .toArray();

System.out.println(Arrays.toString(ints1));

final int[] ints2 = Stream.of(raw.split(""))
    .mapToInt(Integer::parseInt)
    .toArray();

System.out.println(Arrays.toString(ints2));

2 番目のソリューションは、正規表現を使用し、数字ごとに文字列インスタンスを作成するため、おそらく非常に非効率的です。

于 2015-06-05T19:32:05.643 に答える
4

誰もがコード内の無効なキャストを正しく識別しています。そのキャストはまったく必要ありません。Java は暗黙的に次のように変換charされます。int

String raw = "1233983543587325318";

char[] list = raw.toCharArray();
int[] num = new int[raw.length()];

for (int i = 0; i < raw.length(); i++) {
    num[i] = Character.digit(list[i], 10);
}

System.out.println(Arrays.toString(num));
于 2012-06-04T18:18:36.393 に答える
3

各要素を整数配列にキャストするのではなく、整数にキャストする必要がありint[]ますint

for (int i = 0; i > raw.length(); i++)
{
   num[i] = (int)list[i];
}

System.out.println(num);
于 2012-06-04T18:16:57.660 に答える
2

この行:

num[i] = (int[])list[i];

次のようにする必要があります。

num[i] = (int)list[i];
于 2012-06-04T18:15:55.507 に答える
1

今後の参考のために。char から int への変換は、キャストを使用しても暗黙的に行われません。あなたはそのようなことをしなければなりません:

    String raw = "1233983543587325318";

    char[] list = raw.toCharArray();
    int[] num = new int[list.length];

    for (int i = 0; i < list.length; i++){
        num[i] = list[i] - '0';
    }
    System.out.println(Arrays.toString(num));
于 2013-03-19T20:29:48.770 に答える
1

list[i]にキャストすることはできませんがint[]、にキャストできintます。配列の各インデックスは単なる int であり、int の配列ではありません。

だからそれはちょうどあるべきです

num[i] = (int)list[i];
于 2012-06-04T18:17:31.123 に答える
0

変換の問題については誰もが正しいです。実際に正しいバージョンを試したようですが、出力が文字化けしていました。これはsystem.out.println(num)、この場合、あなたが望むことをしないからです:)system.out.println(java.util.Arrays.toString(num))代わりに使用し、詳細についてはこのスレッドを参照してください。

于 2012-06-04T18:23:16.453 に答える
0

このクラス: http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.htmlが役立ちます。文字列から整数を解析できます。配列を使用するよりも少し簡単です。

于 2012-06-04T18:16:16.290 に答える
0
String raw = "1233983543587325318";
char[] c = raw.toCharArray();
int[] a = new int[raw.length()];

for (int i = 0; i < raw.length(); i++) {
   a[i] = (int)c[i] - 48;
} 
于 2015-12-23T21:13:06.640 に答える