web-dev-qa-db-fra.com

Fractionner String et le mettre sur un tableau int

Je dois entrer une chaîne avec des nombres ex: 1,2,3,4,5 . C'est un exemple de l'entrée, puis je le mets dans un tableau d'INT pour pouvoir le trier mais ne fonctionne pas la façon dont cela devrait fonctionner.

package array;

import Java.util.Scanner;

public class Array {

    public static void main(String[] args) {
        String input;
        int length, count, size;
        Scanner keyboard = new Scanner(System.in);
        input = keyboard.next();
        length = input.length();
        size = length / 2;
        int intarray[] = new int[size];
        String strarray[] = new String[size];
        strarray = input.split(",");

        for (count = 0; count < intarray.length ; count++) {
            intarray[count] = Integer.parseInt(strarray[count]);
        }

        for (int s : intarray) {
            System.out.println(s);
        }
    }
}
24
user1076331

Pour 1,2,3,4,5, la longueur d’entrée est 9. 9/2 = 4 en maths entier, vous ne stockez donc que les quatre premières variables, pas toutes les 5.

Même si vous corrigiez cela, cela casserait horriblement si vous passiez une entrée de 10,11,12,13

Cela fonctionnerait (par hasard) si vous utilisiez 1,2,3,4,50 pour une entrée, assez étrangement :-)

Tu ferais bien mieux de faire quelque chose comme ça

String[] strArray = input.split(",");
int[] intArray = new int[strArray.length];
for(int i = 0; i < strArray.length; i++) {
    intArray[i] = Integer.parseInt(strArray[i]);
}

Pour toute référence future, lorsque vous recevez une erreur, je vous recommande fortement de la publier avec le code. Vous pourriez ne pas avoir quelqu'un avec un jdk facilement disponible pour compiler le code pour le déboguer! :)

50
corsiKa

Java 8 offre une alternative basée sur les flux à l'itération manuelle:

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

Soyez prêt à intercepter NumberFormatException s'il est possible que l'entrée contienne des séquences de caractères qui ne peuvent pas être converties en un entier.

17
Andy Brown

Considérons que vous avez entré comme "1,2,3,4".

Cela signifie que la longueur de l'entrée est de 7. Donc, maintenant vous écrivez la taille = 7/2 = 3.5. Mais comme la taille est un int, elle sera arrondie à 3. En bref, vous perdez une valeur.

Si vous réécrivez le code comme ci-dessous, cela devrait fonctionner:

String input;
int length, count, size;
Scanner keyboard = new Scanner(System.in);
input = keyboard.next();
length = input.length();

String strarray[] = input.split(",");
int intarray[] = new int[strarray.length];

for (count = 0; count < intarray.length ; count++) {
    intarray[count] = Integer.parseInt(strarray[count]);
}

for (int s : intarray) {
    System.out.println(s);
}
2
Tapan Thaker
String input = "2,1,3,4,5,10,100";
String[] strings = input.split(",");
int[] numbers = new int[strings.length];
for (int i = 0; i < numbers.length; i++)
{
  numbers[i] = Integer.parseInt(strings[i]);
}
Arrays.sort(numbers);

System.out.println(Arrays.toString(numbers));
0
Trevor Freeman

Changez juste un peu l'ordre dans lequel vous faites les choses. Vous semblez diviser par 2 sans aucune raison particulière. 

Bien que votre application ne garantisse pas une chaîne d'entrée de variables délimitées par des points-virgules, vous pouvez facilement le faire: 

package com;

import Java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        // Good practice to initialize before use
        Scanner keyboard = new Scanner(System.in);
        String input = "";
        // it's also a good idea to Prompt the user as to what is going on
        keyboardScanner : for (;;) {
            input = keyboard.next();
            if (input.indexOf(",") >= 0) { // Realistically we would want to use a regex to ensure [0-9],...etc groupings 
                break keyboardScanner;  // break out of the loop
            } else { 
                keyboard = new Scanner(System.in);
                continue keyboardScanner; // recreate the scanner in the event we have to start over, just some cleanup
            }
        }

        String strarray[] = input.split(","); // move this up here      
        int intarray[] = new int[strarray.length];

        int count = 0; // Declare variables when they are needed not at the top of methods as there is no reason to allocate memory before it is ready to be used
        for (count = 0; count < intarray.length; count++) {
            intarray[count] = Integer.parseInt(strarray[count]);
        }

        for (int s : intarray) {
            System.out.println(s);
        }
    }
}
0
Mike McMahon

Vous effectuez une division en nombres entiers, vous perdrez donc la longueur correcte si l'utilisateur insère un nombre impair d'entrées - c'est un problème que j'ai remarqué. De ce fait, lorsque je lance le code avec une entrée de '1,2,3,4,5,6,7', ma dernière valeur est ignorée ...

0
Colby