web-dev-qa-db-fra.com

Conversion d'un tableau de chaînes en un tableau entier

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.

20
Mario

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.

34
Java Devil

Ligne par ligne

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

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));
0
Ritam Chakraborty
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
0
Shreyansh