2011-12-01 18 views
21

Tengo que ingresar una cadena con números ex: 1,2,3,4,5. Eso es una muestra de la entrada, luego tengo que poner eso en una matriz de INT para que pueda ordenarlo pero no funciona de la manera que debería funcionar.División de String y ponerlo en la matriz int

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); 
     } 
    } 
} 
+0

"no funciona como debería funcionar" de qué manera? ¿error? no funciona frente a malas entradas? s siempre está vacío? –

+3

'strArr = input.split (',')' simplemente copie strArr en intArr – Enrique

Respuesta

46

1,2,3,4,5 Para la entrada de la entrada es de longitud 9. 9/2 = 4 en matemáticas número entero, por lo que sólo está almacenando los primeros cuatro variables, no todos 5.

Incluso si se fija que, se rompería horriblemente si aprobó en una entrada de 10,11,12,13

sería funciona (por casualidad) si se ha utilizado 1,2,3,4,50 para una entrada, curiosamente :-)

usted sería mucho mejor hacer algo como esto

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

Para futuras referencias, cuando reciba un error, le recomiendo que lo publique con el código. ¡Es posible que no tenga a alguien con un jdk disponible para compilar el código para depurarlo! :)

0

Usted está haciendo la división de enteros, por lo que perderá la longitud correcta si el usuario coloca un número impar de entradas; ese es un problema que noté. Debido a esto, cuando ejecuto el código con una entrada de '1,2,3,4,5,6,7' mi último valor se ignora ...

1

Consideremos que tiene la entrada como "1, 2,3,4 ".

Eso significa que la longitud de la entrada es 7. Entonces, ahora escribe el tamaño = 7/2 = 3.5. Pero como el tamaño es int, se redondeará a 3. En resumen, está perdiendo 1 valor.

Si reescribir el código de la siguiente debería funcionar:

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); 
} 
1
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

Le recomiendo que use esto en su lugar: números [i] = Integer.parseInt (cadenas [i] .trim()) de lo contrario, si la cadena fuera "4,22,42" arrojaría una excepción. –

0

cambiar el orden en el que usted está haciendo las cosas un poco. Pareces dividir por 2 sin ninguna razón en particular.

Mientras que su solicitud no garantiza una cadena de entrada de variables punto y coma delimitado que podría fácilmente hacer que funcione:

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

La división por 2 está allí debido a la suposición de que para cada número, hay una coma correspondiente.Por supuesto, sabemos que esta es una suposición errónea, pero estoy seguro de que esa era la línea de pensamiento de OP en ese momento. – corsiKa

-2

Algo como esto:

public static void main(String[] args) { 
    String N = "ABCD"; 
    char[] array = N.toCharArray(); 

    // and as you can see: 
    System.out.println(array[0]); 
    System.out.println(array[1]); 
    System.out.println(array[2]); 
    } 
+0

@Downvoters, al menos comentar el motivo de la baja. –

7

Java 8 ofrece una streams- alternativo basado en la iteración Manual:

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

Estar preparado para coger NumberFormatException si es posible que la entrada contenga secuencias de caracteres que no se pueden convertir a un número entero.

Cuestiones relacionadas