2012-10-31 10 views
8

Ich habe eine Character Array (nicht Char-Array) und ich möchte es in eine Zeichenfolge konvertieren, indem Sie alle Zeichen im Array kombinieren.Konvertieren von Zeichen-Array in String

Ich habe folgendes für ein gegebenes Character[] a versucht:

String s = new String(a) //given that a is a Character array 

Aber das funktioniert nicht, da ein kein char-Array ist. Ich würde jede Hilfe schätzen.

+0

oben arbeitet an char [] :) –

Antwort

5

Iterate und verketten Ansatz:

Character[] chars = {new Character('a'),new Character('b'),new Character('c')}; 

String str = ""; 

for (Character c : chars) 
    str += c.toString(); 

System.out.println(str); 

Ausgang:

abc

+3

Ich würde nur überprüfen, kompiliert zu einem StringBuilder, für beträchtliche 'n' .. Ich * denke * das wird in diesen Tagen passieren. –

+0

Also für N-Länge-Array werden Sie am Ende mit N Zeichenfolgen im Speicher –

+1

@ PST - Ich bin ziemlich sicher, dass die JLS Zeichenfolge Verkettung Optimierung über mehrere Anweisungen nicht sanktioniert. –

14
Character[] a = ... 
new String(ArrayUtils.toPrimitive(a)); 

ArrayUtils Teil Apache Commons Lang ist.

+5

+1 für Klasse Ich wusste nicht, ich verstehe nicht, warum solche Klasse nicht in JDK ist: -/ – Betlista

+0

Es macht nichts besonderes besonders. Es erstellt nur ein char [] von gleicher Länge und fügt die char-Werte hinzu. Sehr einfacher Code. Aufgabe des JDK ist es, sich auf den Kern der Sprache zu konzentrieren und nicht so einfache, häufige Probleme zu lösen. Eine Open-Source-Utility-Bibliothek ist dafür der richtige Ort. – rees

+1

Diese Bibliothek sollte für diese Lösung nicht enthalten sein, aber ich habe die Erfahrung, dass ich sie sowieso schon für etwas anderes enthalten habe! – rees

2

Rufen Sie bei jedem Index die toString-Methode auf und verketten Sie das Ergebnis mit Ihrem String s.

2

zuerst die Character[]-char[], konvertieren und verwenden String.valueOf(char[]) den String zu erhalten, wie unten:

char[] a1 = new char[a.length]; 
    for(int i=0; i<a.length; i++) { 
     a1[i] = a[i].charValue(); 
    } 
    String text = String.valueOf(a1); 
    System.out.println(text); 
2

wie über Ihre eigene Methode erstellen, die eine Iteration durch die Liste der Zeichen-Array, dann jeden Wert auf Ihre neue Zeichenfolge anhängt .

So etwas wie das.

public String convertToString(Character[] s) { 
    String value; 

    if (s == null) { 
    return null; 
    } 

    Int length = s.length(); 
    for (int i = 0; i < length; i++) { 
    value += s[i]; 
    } 

    return value; 
} 
+0

Sie überprüfen "s" für null, nachdem Sie 'length()' darauf aufgerufen haben. – rees

+0

Hätte ich zuerst bemerkt, dass ich es für ein gutes Beispiel für andere optimieren wollte. :) – Tom

+0

IMO, die 'Null' Prüfung ist fehlgeleitet. Standardmäßig ist ein "null" -Argument auf einen Programmiererfehler zurückzuführen, und der beste Weg, damit umzugehen, ist das Werfen einer NPE. –

3

Es ist wahrscheinlich langsam, aber für Kicks hier ist ein hässlicher Einzeiler, die anders als die anderen Ansätze ist -

Arrays.toString(characterArray).replaceAll(", ", "").substring(1, characterArray.length + 1); 
8

Der effizienteste Weg, es zu tun, ist höchstwahrscheinlich die:

Character[] chars = ... 

StringBuilder sb = new StringBuilder(chars.length); 
for (Character c : chars) 
    sb.append(c.charValue()); 

String str = sb.toString(); 

Hinweise:

  1. eine Verwendung StringBuilder vermeidet das Erstellen mehrerer Zwischenzeichenfolgen.
  2. Die Bereitstellung der ursprünglichen Größe vermeidet Neuzuweisungen.
  3. charValue() Verwendung vermeidet Character.toString() Aufruf ...

Allerdings würde ich mit @ gehen wahrscheinlich Torious eleganten Antwort, es sei denn Leistung ein wichtiges Thema war.


übrigens sagt die JLS, dass die Compiler String Verkettung Ausdrücke äquivalent String Code zu optimieren erlaubt ist ... aber es sanktioniert nicht, dass die Optimierung über mehrere Aussagen.Deshalb etwas wie folgt aus:

String s = "" 
    for (Character c : chars) { 
     s += c; 
    } 

wahrscheinlich viele getrennte Verkettungen zu tun, (und Verwerfen) viele Zwischen Saiten zu schaffen.

0
int length = cArray.length; 
String val=""; 
for (int i = 0; i < length; i++) 
    val += cArray[i]; 
System.out.println("String:\t"+val); 
3

Wahrscheinlich zuviel des Guten, aber auf Java 8 Sie könnten dies tun:

Character[] chars = {new Character('a'),new Character('b'),new Character('c')}; 

String value = Arrays.stream(chars) 
       .map(Object::toString) 
       .collect(Collectors.joining()); 
+1

'Arrays.asList (chars) .stream()' kann zu 'Arrays.stream (chars)' vereinfacht werden – Roman

0

Eigentlich, wenn Sie Guava haben, können Sie Chars.toArray() verwenden char[] zu produzieren dann einfach dieses Ergebnis zu String.valueOf() senden.