基本的に、ユーザーはスキャナー入力からシーケンスを入力します。 _12, 3, 4
_など.
長さは任意で、整数でなければなりません。
文字列入力を整数配列に変換したい。
したがって、_int[0]
_は_12
_、_int[1]
_は_3
_などになります。
ヒントやアイデアはありますか?私はif charat(i) == ','
を実装して以前の番号を取得し、それらを一緒に解析して、配列で現在利用可能なスロットに適用することを考えていました。しかし、それをどのようにコーディングするかはよくわかりません。
スキャナーから入力行全体を読み取ってから、,
で行を分割し、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]
例外をキャッチしないことでパフォーマンスを改善できる可能性があり( これについて詳しくはこの質問を参照 )、別の方法を使用して有効な整数を確認します。
1行ずつ
int [] v = Stream.of(line.split(",\\s+"))
.mapToInt(Integer::parseInt)
.toArray();
Stream.of().mapToInt().toArray()
が最適なオプションのようです。
int[] arr = Stream.of(new String[]{"1", "2", "3"})
.mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(arr));
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