2014-09-06 8 views
5

Ho un ingresso come questo in un ArrayList<String>:come dividere un arraylist di String ogni volta che si incontra uno spazio in java?

cat eats mouse 

mouse eats cheese 
cheese is tasty 

(righe vuote devono essere ignorate da quando mi sarà la lettura di questo input da un file)

e voglio convertirlo in un 2- d array di String che avrà dimensioni [no. of elements in ArrayList][3].

Il n. 3 è fisso, cioè ogni frase avrà 3 parole. come questo:

"cat" "eats" "mouse" 
"mouse" "eats" "cheese" 
"cheese" "is" "tasty" 

ecco cosa ho provato:

public static int processData(ArrayList<String> array) 
    { 
     String str[]=new String[array.size()]; 
     array.toArray(str); 

     String str1[][]=new String[str.length][5]; 
     for(int i=0;i<str.length;i++) 
     { 
       str1[i][]=str.split("\\s+"); //i want to do something like this, but this is showing errors. 

     } 

     return 0; //this is temporary, I will be modifying it 
    } 

Ditemi se non mi è chiaro.

risposta

3

Sei vicino. In Java, non puoi inserire nuovi elementi alla fine di un array usando le parentesi vuote []. Il seguente codice fa la cosa. Nota che il numero di elementi nel secondo array è limitato di 5. Quindi, dopo le prime 5 parole, il resto della riga verrà ignorato. Se la linea è più corta, ci saranno null s alla fine dell'array.

public static int processData(ArrayList<String> array) { 
    String[] str = new String[array.size()]; 
    array.toArray(str); 

    String[][] str1 = new String[str.length][3]; 

    for(int i=0; i < str.length; i++) { 
     String[] parts = str[i].split("\\s+"); 

     for(int j = 0; j < parts.length || j < 3; j++) { 
      str1[i][j] = parts[j]; 
     } 
    } 

    // do something next 
} 
+0

Non so perché ma str.split() sta mostrando gli errori: 'Impossibile richiamare split (String) sul tipo di matrice String []' –

+0

Oh, capisco. È perché str è una matrice. Lo aggiusterò .. –

+0

Inoltre, una pratica migliore è dichiarare gli array come 'String [] str', non' String str [] '. –

2

Una versione più breve, e slightelly più efficiente:

static int processData(ArrayList<String> array) 
{ 
    String str[][] = new String[array.size()][3]; 
    for(int i = 0; i < str.length; ++i) { 
     str[i] = array.get(i).split("\\s+"); 
    } 
    return 0; 
} 

Non c'è reasion per il primo array chiamato str nel codice, dal momento che l'accesso cann delle corde direttamente dalla ArrayList.

Inoltre è possibile non è necessario copiare le corde, si può semplicemente mettere gli array di stringhe in array di array, come nel mio codice

Inoltre, se si dispone di una dimensione fissa di 3, e non è necessario aggiungere altro agli array, perché allocare lo spazio per 5 stringhe?

+0

A meno che non sia necessario l'array 'str' unidimensionale, questo potrebbe essere migliore. Ho iniziato dal codice del principiante dandomi la risposta per mostrare quali modifiche necessarie devono essere apportate –

+1

Capisco cosa hai fatto e, come ho detto, penso che la tua risposta sia corretta, volevo solo far notare che esiste un modo per farlo un po 'più efficiente, dal momento che @Newbie sembra essere nuovo e potrebbe averlo fatto, perché non conosceva la funzione 'get()' – Ongy

+0

Grazie, proverò questo .. +1 per aiutare –

0

Cambia il tuo ciclo for per:

String str1[][] = new String[str.length][3]; 
for(int i = 0; i < str.length; i++) { 
    str1[i] = str[i].split("\\s+");  
} 

Non è necessario disporre di 5 elementi, se si sa di avere solo 3 parole, non sprecare le risorse.

str è un String[], str[i] è un String, str[i].split() è un String[] e così è str1[i]. I tipi corrispondono.

Inoltre, in questo modo il codice è più chiaro e più comprensibile. Sono d'accordo con Ongy per rimuovere str se non ne hai bisogno, ma non posso dire ora, perché lei ha detto che si sta per cambiare questo metodo seguito (almeno il valore di ritorno)

Bonus: Btw , i nomi array, str, str1 non sono la scelta migliore per quel pezzo di codice, è davvero facile essere confusi di cosa si tratta.Prova a trovare una migliore nome come lines, linesArray, words o qualcosa del genere

+1

Certo .. Lo farò .. :) –

0

Come lei ha ricordato "arraylist" in Oggetto:

try{ 
    BufferedReader br = new BufferedReader(new FileReader("filename")); 
    Arraylist<String[]> l = new ArrayList<String[]>(); 
    String line; 
    while((line = br.readline) != null) 
     l.add(line.split("\\s+"); 

    br.close(); 
}catch(Exception e){e.printStackTrace();} 
+0

ho già letto il contenuto del file nel funzione principale nell'arrayista .. Sto passando a questa funzione –