2011-12-01 10 views
21

Devo inserire una stringa con numeri ex: 1,2,3,4,5. Questo è un esempio di input, quindi devo inserirlo in un array di INT in modo da poterlo ordinare ma non funziona come dovrebbe funzionare.Splitting String e metterlo su array 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

"non funziona come dovrebbe funzionare" in che modo? errore? non funziona a fronte di input sbagliati? s è sempre vuoto? –

+3

'strArr = input.split (',')' quindi copia semplicemente strArr su intArr – Enrique

risposta

46

Per l'ingresso 1,2,3,4,5 l'ingresso è di lunghezza 9. 9/2 = 4 in matematica intero, così si sta memorizzando solo le prime quattro variabili, non tutti 5.

Anche se viene confermato che, si spezzerebbe orribilmente se hai superato in un ingresso di 10,11,12,13

che avrebbe funzionato (per caso) se si è utilizzato 1,2,3,4,50 per un ingresso, stranamente :-)

si sarebbe molto meglio fare qualcosa di simile questo

Per riferimento futuro, quando si riceve un errore, consiglio vivamente di postarlo con il codice. Potresti non avere qualcuno con un jdk prontamente disponibile per compilare il codice per eseguirne il debug! :)

0

Si sta eseguendo la divisione Integer, quindi si perderà la lunghezza corretta se l'utente inserisce un numero dispari di input - questo è un problema che ho notato. Per questo motivo, quando eseguo il codice con un input di "1,2,3,4,5,6,7", il mio ultimo valore viene ignorato ...

1

Consideriamo che hai inserito come "1, 2,3,4" .

Ciò significa che la lunghezza dell'input è 7. Quindi ora si scrive la dimensione = 7/2 = 3.5. Tuttavia, poiché la dimensione è int, verrà arrotondata a 3. In breve, stai perdendo 1 valore.

Se riscrivere il codice come di seguito dovrebbe funzionare:

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

Ti consiglio di usare questo invece: numeri [i] = Integer.parseInt (stringhe [i] .trim()) altrimenti se la stringa fosse "4,22,42" genererebbe un'eccezione. –

0

Modificare l'ordine in cui si sta facendo le cose solo un po '. Sembra che tu stia dividendo per 2 senza alcun motivo particolare.

mentre l'applicazione non garantisce una stringa di input di variabili semi delimitato da due punti si potrebbe facilmente fargli fare così:

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 divisione per 2 è lì a causa del presupposto che per ogni numero, c'è una virgola corrispondente.Certo, sappiamo che questa è un'ipotesi errata, ma sono sicuro che al momento fosse la linea di pensiero dell'OP. – corsiKa

-2

Qualcosa di simile a questo:

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, commenta almeno il motivo del downvoting. –

7

Java 8 offre una streams- alternativa basata su iterazione manuale:

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

Prepararsi a prendere NumberFormatException se è possibile che l'input contenga sequenze di caratteri che non possono essere convertite in un numero intero.