donc, en gros, l'utilisateur entre une séquence à partir d'une entrée de scanner. 12, 3, 4
, Etc.
Il peut être de n'importe quelle longueur et il doit s'agir de nombres entiers.
Je veux convertir l'entrée de chaîne en un tableau entier.
donc int[0]
serait 12
, int[1]
serait 3
, etc.
Des conseils et des idées? Je pensais à la mise en oeuvre de if charat(i) == ','
, récupérer les numéros précédents, les analyser et les appliquer à l'emplacement disponible du tableau. Mais je ne sais pas trop comment coder ça.
Vous pouvez lire la totalité de la ligne d'entrée à partir du scanner, puis diviser la ligne par ,
alors vous avez un String[]
, analyser chaque numéro en int[]
avec l'index 1 à 1 correspondant ... (en supposant une entrée valide et pas NumberFormatExceptions
) comme
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]);
}
Comme la réponse de YoYo le suggère, il est possible de réaliser ce qui précède de manière plus concise en Java 8:
int[] numbers = Arrays.stream(line.split(",")).mapToInt(Integer::parseInt).toArray();
Pour gérer les entrées non valides
Vous devrez réfléchir à ce que vous voulez faire dans ce cas. Voulez-vous savoir qu'il y a eu une mauvaise entrée à cet élément ou simplement le sauter?.
Si vous n'avez pas besoin de savoir sur une entrée non valide mais souhaitez simplement continuer à analyser le tableau, vous pouvez procéder comme suit:
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);
La raison pour laquelle nous devrions couper le tableau résultant est que les éléments invalides à la fin du int[]
sera représenté par un 0
, ils doivent être supprimés afin de différencier une valeur d'entrée valide de 0
.
Résulte en
Entrée: "2,5,6, mauvais, 10"
Résultat: [2,3,6,10]
Si vous avez besoin de connaître les entrées invalides ultérieurement, vous pouvez procéder comme suit:
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;
}
}
Dans ce cas, une mauvaise entrée (pas un entier valide), l'élément sera nul.
Résulte en
Entrée: "2,5,6, mauvais, 10"
Sortie: [2,3,6, null, 10]
Vous pourriez potentiellement améliorer les performances en ne capturant pas l'exception ( voir cette question pour plus d'informations ) et en utilisant une méthode différente pour vérifier les entiers valides.
Ligne par ligne
int [] v = Stream.of(line.split(",\\s+"))
.mapToInt(Integer::parseInt)
.toArray();
Stream.of().mapToInt().toArray()
semble être la meilleure option.
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);
}
}
}
mais pour terminer la boucle while, vous devez mettre n'importe quel caractère à la fin de l'entrée.
ex. contribution:
12 34 56 78 45 67 .
sortie:
12 34 56 78 45 67