2013-03-23 4 views
15

Kann mir jemand helfen und sagen, wie Sie eine char-Array in eine Liste und umgekehrt konvertieren. Ich versuche, ein Programm zu schreiben, in dem Benutzer eine Zeichenfolge eingeben (z. B. "Mike is good") und in der Ausgabe wird jeder Leerzeichen durch "%20" (IE "Mike%20is%20good") ersetzt. Obwohl dies auf viele Arten gemacht werden kann, aber da das Einfügen und Löschen eine O (1) Zeit in der verknüpften Liste benötigt, dachte ich daran, es mit einer verknüpften Liste zu versuchen. Ich suche nach einem Weg, ein char Array in eine Liste zu konvertieren, die Liste zu aktualisieren und sie dann zurück zu konvertieren.Konvertieren von Char-Array zu Liste 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"*/ 
    } 
} 

So in diesem Programm der Benutzer die Zeichenfolge eingegeben hat, die ich in einem StringBuffer bin speichern, die ich zuerst in einen String bin Umwandlung und dann zu einem char Array, aber ich bin nicht in der Lage, eine Liste zu erhalten l von s.

Ich wäre sehr dankbar, wenn jemand bitte den richtigen Weg zur Umwandlung char Array zu einer Liste und umgekehrt sagen kann.

+2

Sie können keine primitiven Datentyp für Ihre Liste, Sie brauchen Zeichen intead. Ihr Ansatz wird jedoch nicht funktionieren, verwenden Sie z. ArrayUtils.toObject (char []) von [Apache Commons] (http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html) statt. – s106mo

Antwort

15

Da char primitiver Typ ist, funktioniert der Standard Arrays.asList(char[]) nicht. Es wird List<char[]> anstelle von List<Character> produzieren ... so etwas übrig blieb, ist über Array zu durchlaufen, und neue Liste füllen mit den Daten aus dem Array:

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

Und das ist, wie Sie List zurück zu Array konvertieren:

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




das lustige daran ist, warum List<char[]> asList = Arrays.asList(chars); tut, was es tut: asList Array nehmen oder Vararg. In diesem Fall wird char [] chars als einwertiger Vararg vonchar[] betrachtet! So kann man auch so etwas wie

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

+0

Liste asList = Arrays.asList (Zeichen); // weil das kompiliert wird. Nein, das kompiliert nicht: Die Methode asList (Object []) im Typ Arrays ist nicht anwendbar für die Argumente (char []) –

+0

@PhilipJ ja, tut es. Es tut das in meiner Eclipse. Wenn es ** NICHT ** in Ihrem Fall ist - reichen Sie einen Fehlerbericht ein. Im angegebenen Code wird 'char []' zu einem einzelnen Objekt und nicht zu einem Array von Chars. Und das ist sogar in meiner Antwort geschrieben. – dantuch

1

Sie nicht Generika in Java mit primitiven Typen verwenden können, why?

Wenn Sie wirklich konvertieren möchten Array zur Liste und zurück dann dantuch Ansatz ist die richtig eins.

Aber wenn Sie wollen einfach nur den Ersatz zu tun, gibt es Methoden gibt (nämlich java.lang.String ‚s replaceAll), die es für Sie

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

Sie können es wie folgt verwenden:

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

Ausgang:

Mike%20is%20good 
13

eine andere Möglichkeit, als mit einer Schleife sein würde Verwenden Sie GuavaChars.asList() Methode.Dann wird der Code einen String zu einem LinkedList Charakter zu konvertieren ist einfach:

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

oder in einer mehr Guava Weise:

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

Die Guava Bibliothek eine Menge guter Sachen enthält, so ist es wert einschließlich es in Ihrem Projekt.

+1

Wer hat den Downvote gemacht? Wie kann ich diese Antwort verbessern? –

+0

@Cyrille Ka Ich habe nicht abgestimmt, aber ich nehme an, es liegt daran, dass die von Ihnen zur Verfügung gestellte Antwort nicht kompiliert wird (und wahrscheinlich nicht kompiliert werden kann). – mbmast

+0

@mbmast Soweit ich das beurteilen kann, habe ich versucht, beide Beispiele auf Java 5 bis 8 zu kompilieren, vorausgesetzt, dass "string" eine Variable vom Typ String ist, die zuvor initialisiert wurde und die Guava-Abhängigkeit im Projekt enthalten ist. Bitte sagen Sie mir den Compiler Fehler, wenn es auf Ihrem Rechner fehlschlägt. –

14

In Java 8 stellt CharSequence::chars Verfahren eine einzeilige Art und Weise ein String in List<Character> zu konvertieren:

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

Und wenn Sie char[]-List<Character> konvertieren müssen, könnten Sie eine String von ihm zuerst erstellen und dann Wenden Sie die obige Lösung an. Obwohl es nicht sehr lesbar und schön sein wird, wird es ziemlich kurz sein.

2

Jetzt werde ich poste diese Antwort als eine weitere Option für all jene Entwickler, die nicht erlaubt sind, jede lib zu verwenden, sondern nur die Macht der 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); 
Verwandte Themen