2013-03-23 17 views
15

Qualcuno può aiutarmi e dire come convertire un array char in un elenco e viceversa. Sto provando a scrivere un programma in cui gli utenti immettono una stringa (ad esempio "Mike is good") e nell'output, ogni spazio bianco viene sostituito da "%20" (I.e "Mike%20is%20good"). Anche se questo può essere fatto in molti modi, ma poiché l'inserimento e la cancellazione richiedono O (1) tempo nella lista collegata ho pensato di provarlo con una lista collegata. Sto cercando in qualche modo di convertire un array char in un elenco, aggiornando l'elenco e quindi riconvertendolo.Conversione di array di caratteri in elenco in Java

public class apples 
{ 
    public static void main(String args[]) 
    { 
     Scanner input = new Scanner(System.in); 
     StringBuffer sb = new StringBuffer(input.nextLine()); 

     String s = sb.toString(); 
     char[] c = s.toCharArray(); 
     //LinkedList<char> l = new LinkedList<char>(Arrays.asList(c)); 
     /* giving error "Syntax error on token " char", 
     Dimensions expected after this token"*/ 
    } 
} 

Quindi in questo programma che l'utente sta entrando la stringa, che sto memorizzazione in un StringBuffer, che sto prima la conversione in una stringa e poi a un array char, ma io non sono in grado di ottenere un elenco l da s.

Sarei molto grato se qualcuno possa dire il modo corretto di convertire l'array char in un elenco e viceversa.

+2

non è possibile utilizzare un tipo di dati primitivi per la vostra Elenco, hai bisogno di Character intead. Tuttavia, il tuo approccio non funzionerà, quindi utilizza per es. ArrayUtils.toObject (char []) di [Apache Commons] (http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html). – s106mo

risposta

15

Poiché il carattere char è di tipo primitivo, lo standard Arrays.asList(char[]) non funzionerà. Produrrà List<char[]> al posto di List<Character> ... quindi ciò che resta è quello di iterare array, e riempire nuova lista con i dati provenienti da tale matrice:

public static void main(String[] args) { 
    String s = "asdasdasda"; 
    char[] chars = s.toCharArray(); 

    //  List<Character> list = Arrays.asList(chars); // this does not compile, 
    List<char[]> asList = Arrays.asList(chars); // because this DOES compile. 

    List<Character> listC = new ArrayList<Character>(); 
    for (char c : chars) { 
     listC.add(c); 
    } 
} 

E questo è il modo di convertire Ritorna ai matrice:

Character[] array = listC.toArray(new Character[listC.size()]); 




La cosa divertente è il motivo per cui List<char[]> asList = Arrays.asList(chars); fa quello che fa: asList può prendere array o vararg. In questo caso char [] chars è considerato come vararg singolo valore dichar[]! Così si può anche scrivere qualcosa di simile

List<char[]> asList = Arrays.asList(chars, new char[1]); :)

+0

Elenco asList = Arrays.asList (caratteri); // perché questo viene compilato. No questo non viene compilato: Il metodo asList (Object []) nel tipo Array non è applicabile per gli argomenti (char []) –

+0

@PhilipJ sì, lo fa. Lo fa nel mio Eclipse. Se lo fa ** NON ** nel tuo - invia un bug report. Nel codice dato 'char []' diventa un singolo oggetto, non un array di caratteri. E questo è anche scritto nella mia risposta. – dantuch

1

Non è possibile utilizzare farmaci generici in Java con tipi primitivi, why?

Se davvero si vuole convertire in lista e di nuovo ad un array, allora l'approccio di dantuch è il correggi uno.

Ma se si vuole solo fare la sostituzione ci sono metodi là fuori (cioè java.lang.String s' replaceAll) che può farlo per voi

private static String replaceWhitespaces(String string, String replacement) { 
    return string != null ? string.replaceAll("\\s", replacement) : null; 
} 

Si può usare in questo modo:

StringBuffer s = new StringBuffer("Mike is good"); 
System.out.println(replaceWhitespaces(s.toString(), "%20")); 

uscita:

Mike%20is%20good 
13

un altro modo di utilizzare un ciclo sarebbe quello di utilizzare il metodo GuavaChars.asList().Poi il codice per convertire una stringa in un LinkedList di carattere è solo:

LinkedList<Character> characterList = new LinkedList<Character>(Chars.asList(string.toCharArray())); 

o, in modo Guava più:

LinkedList<Character> characterList = Lists.newLinkedList(Chars.asList(string.toCharArray())); 

La biblioteca Guava contiene un sacco di roba buona, quindi vale la pena includendolo nel tuo progetto.

+1

A chi ha fatto downvote ... come posso migliorare questa risposta? –

+0

@Cirille Ka Non ho votato, ma suppongo che sia perché la risposta che hai fornito non viene compilata (e probabilmente non può essere corretta per la compilazione). – mbmast

+0

@mbmast Per quanto posso dire, e ho appena provato, entrambi gli esempi vengono compilati su Java da 5 a 8, a condizione che "stringa" sia una variabile di tipo String precedentemente inizializzata e la dipendenza di Guava sia inclusa nel progetto. Per favore dimmi l'errore del compilatore se fallisce sul tuo computer. –

14

In Java 8, CharSequence::chars metodo fornisce un modo di una sola riga per convertire un String in List<Character>:

myString.chars().mapToObj(c -> (char) c).collect(Collectors.toList()); 

E se avete bisogno di convertire char[]-List<Character>, è possibile creare un String da esso e poi applica la soluzione sopra. Anche se non sarà molto leggibile e carino, sarà piuttosto breve.

2

Ora mi post questa risposta come un'altra opzione per tutti gli sviluppatori che non sono autorizzati a usare qualsiasi lib ma solo la potenza di Java 8 :)

char[] myCharArray = { 'H', 'e', 'l', 'l', 'o', '-', 'X', 'o', 'c', 'e' }; 

Stream<Character> myStreamOfCharacters = IntStream 
      .range(0, myCharArray.length) 
      .mapToObj(i -> myCharArray[i]); 

List<Character> myListOfCharacters = myStreamOfCharacters.collect(Collectors.toList()); 

myListOfCharacters.forEach(System.out::println); 
Problemi correlati