web-dev-qa-db-ja.com

文字列配列から整数配列への変換

基本的に、ユーザーはスキャナー入力からシーケンスを入力します。 _12, 3, 4_など.
長さは任意で、整数でなければなりません。
文字列入力を整数配列に変換したい。
したがって、_int[0]_は_12_、_int[1]_は_3_などになります。

ヒントやアイデアはありますか?私はif charat(i) == ','を実装して以前の番号を取得し、それらを一緒に解析して、配列で現在利用可能なスロットに適用することを考えていました。しかし、それをどのようにコーディングするかはよくわかりません。

20
Mario

スキャナーから入力行全体を読み取ってから、,で行を分割し、String[]を取得し、インデックス番号が1対1で一致する各番号をint[]に解析します...(有効な入力でNumberFormatExceptionsがない場合)

String line = scanner.nextLine();
String[] numberStrs = line.split(",");
int[] numbers = new int[numberStrs.length];
for(int i = 0;i < numberStrs.length;i++)
{
   // Note that this is assuming valid input
   // If you want to check then add a try/catch 
   // and another index for the numbers if to continue adding the others (see below)
   numbers[i] = Integer.parseInt(numberStrs[i]);
}

YoYoの答え が示唆するように、上記のことはJava 8:

int[] numbers = Arrays.stream(line.split(",")).mapToInt(Integer::parseInt).toArray();  

無効な入力を処理するには

この場合、何をする必要があるかを検討する必要がありますか、その要素に不適切な入力があったことを知りたいですか、それともスキップしますか。

無効な入力について知る必要はないが、配列の解析を続けたいだけなら、次のようにできます。

int index = 0;
for(int i = 0;i < numberStrs.length;i++)
{
    try
    {
        numbers[index] = Integer.parseInt(numberStrs[i]);
        index++;
    }
    catch (NumberFormatException nfe)
    {
        //Do nothing or you could print error if you want
    }
}
// Now there will be a number of 'invalid' elements 
// at the end which will need to be trimmed
numbers = Arrays.copyOf(numbers, index);

結果の配列をトリミングする必要があるのは、int[]の最後の無効な要素が0で表されるためです。これらは、0の有効な入力値を区別するために削除する必要があります。

結果

入力:「2,5,6、bad、10」
出力:[2,3,6,10]

後で無効な入力について知る必要がある場合は、次のことができます。

Integer[] numbers = new Integer[numberStrs.length];
for(int i = 0;i < numberStrs.length;i++)        
{
    try 
    {
        numbers[i] = Integer.parseInt(numberStrs[i]);
    }
    catch (NumberFormatException nfe)   
    {
        numbers[i] = null;
    }
}

この場合、無効な入力(有効な整数ではない)は要素がnullになります。

結果

入力:「2,5,6、bad、10」
出力:[2,3,6、null、10]


例外をキャッチしないことでパフォーマンスを改善できる可能性があり( これについて詳しくはこの質問を参照 )、別の方法を使用して有効な整数を確認します。

34
Java Devil

1行ずつ

int [] v = Stream.of(line.split(",\\s+"))
  .mapToInt(Integer::parseInt)
  .toArray();
20
YoYo

Stream.of().mapToInt().toArray()が最適なオプションのようです。

int[] arr = Stream.of(new String[]{"1", "2", "3"})
                  .mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(arr));
0
import Java.util.ArrayList;
import Java.util.List;
import Java.util.Scanner;

class MultiArg {

    Scanner sc;
    int n;
    String as;
    List<Integer> numList = new ArrayList<Integer>();

    public void fun() {
        sc = new Scanner(System.in);
        System.out.println("enter value");
        while (sc.hasNextInt())
            as = sc.nextLine();
    }

    public void diplay() {
        System.out.println("x");
        Integer[] num = numList.toArray(new Integer[numList.size()]);
        System.out.println("show value " + as);
        for (Integer m : num) {
            System.out.println("\t" + m);
        }
    }
}

ただし、whileループを終了するには、文字を入力の最後に配置する必要があります。

例入力:

12 34 56 78 45 67 .

出力:

12 34 56 78 45 67
0
Shreyansh