Jak przekonwertować tablicę znaków z powrotem na ciąg?

405

Mam tablicę znaków:

char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};

Moje obecne rozwiązanie to zrobić

String b = new String(a);

Ale czy jest na to lepszy sposób?

chutsu
źródło
151
Dlaczego myślicie, że istnieje lepszy sposób? I nie nazywaj mnie Shirley. :)
Hovercraft Full Of Eels
Ponieważ zawsze kojarzę tworzenie nowych zmiennych, takich jak powyższe, aby mieć nieznaczny wzrost w czasie działania. Na przykład, jeśli wstawię powyższą linię, aby przekonwertować tablicę char na ciąg znaków w pętlę for, dla mnie nie wygląda to dobrze. I tak, jestem trochę perfekcjonistą. . .
chutsu
1
Jeśli masz wielu takich facetów, powiedz tablicę lub kolekcję char [], być może dołączasz tablice char do StringBuffer, ale w przypadku String tutaj lub tam, to, co opublikowałeś, jest najczęściej używane.
Hovercraft Full Of Eels,
Jeśli szukasz sposobu na uniknięcie kopiowania znaku [], nie ma takiego. W przeciwnym razie możesz obalić niezmienność Stringa.
Paul Cager
13
„tworzenie nowych zmiennych” powoduje zerowe obciążenie. Zmienna jest nazwą używaną do odwoływania się do wartości, a sama nazwa nie występuje nigdzie w pamięci w czasie wykonywania (przynajmniej nie w języku takim jak Java, w którym odbicie jest dość ograniczone). „Narzut” wynika z konstruowania nowej wartości i nie ma takiej możliwości w twoim przypadku, biorąc pod uwagę, że twoim problemem jest „konstruowanie tej wartości”. Nie możesz spowodować, że tablica char magicznie przekształci się w ciąg znaków. Państwo może zorganizować oryginalna tablica char być śmieci zebrane po String jest tworzony.
Karl Knechtel,

Odpowiedzi:

212

Nie, to rozwiązanie jest absolutnie poprawne i bardzo minimalne.

Zauważ jednak, że jest to bardzo nietypowa sytuacja: ponieważ Stringjest obsługiwany specjalnie w Javie, nawet "foo"tak naprawdę jest String. Tak więc potrzeba podzielenia ciągu na poszczególne charlitery i dołączenia ich z powrotem nie jest wymagana w normalnym kodzie.

Porównaj to do C / C ++, gdzie "foo"masz pakiet chars zakończony bajtem zerowym po jednej stronie i stringpo drugiej stronie oraz wiele konwersji między nimi ze względu na starsze metody.

AH
źródło
146

String text = String.copyValueOf(data);

lub

String text = String.valueOf(data);

jest prawdopodobnie lepszy (podsumowuje new Stringpołączenie).

David Titarenco
źródło
6
Obie metody wywołują String(char[])lub ich wariant. Część kopiująca jest zrobiona w środku String(char[]). Nie pozostawia to żadnych korzyści dla bezpośredniego połączenia poza symetrią z innymi valueOfmetodami.
AH
1
statyczne i więcej OOP jest sprzecznością terminów. Cokolwiek zadeklarowane jako statyczne nie jest częścią obiektu ani jego zachowania, a zatem nie jest zorientowane obiektowo. Poza tym - jeśli istnieje jakakolwiek szansa, że ​​implementacja Stringzostanie zmieniona i / lub ulepszona w niekompatybilny sposób lub można wybrać kilka konkurencyjnych implementacji w czasie wykonywania, wówczas sens ma statyczna metoda fabryczna. Nie stanie się tak w przypadku tak niskiego poziomu, jak String. Dlatego moim założeniem jest: Użyj najmniejszego odpowiedniego młotka, a nie największego z dostępnych.
AH
@AH Nie wiem o tym. String ustąpił miejsca StringBuffer, który ustąpił miejsca StringBuilder. Założę się, że zwolennicy StringBuffer powiedzieli to samo, a teraz muszą zmienić kod, aby użyć StringBuilder.
corsiKa
1
@AH Fakt, że musieli stworzyć CharSequenceinterfejs, pokazuje, jak błędne jest twoje „nie stanie się z rzeczami niskiego poziomu, takimi jak string” - nie zmieniają tego, co dzieje się w łańcuchu, ponieważ wcześnie się do niego przywiązali, a teraz chcą nie mieliby.
corsiKa
1
@corsiKa Nie powiedziałem, że String API jest dobre i złote. Tyle tylko, że nie zmieni się w niekompatybilny sposób i że sama klasa i jej konstruktory nigdzie się nie wybiorą. :-)
AH
37

Spowoduje to konwersję tablicy char z powrotem na ciąg znaków:

char[] charArray = {'a', 'b', 'c'};
String str = String.valueOf(charArray);
Billz
źródło
14
String str = "wwwwww3333dfevvv";
char[] c = str.toCharArray();

Teraz, aby przekonwertować tablicę znaków na String, istnieją dwa sposoby.

Arrays.toString(c);

Zwraca ciąg [w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v].

I:

String.valueOf(c)

Zwraca ciąg wwwwww3333dfevvv.

Podsumowując : zwróć uwagę Arrays.toString(c), bo dostaniesz "[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"zamiast "wwwwww3333dfevvv".

AalekhG
źródło
7

Łańcuch w java to tylko obiekt wokół tablicy znaków. Stąd a

char[]

jest identyczny z rozpakowanym ciągiem zawierającym te same znaki. Tworząc nowy ciąg znaków z tablicy znaków

new String(char[])

zasadniczo mówisz kompilatorowi, aby autoboxował obiekt String wokół twojej tablicy znaków.

Nathan Meyer
źródło
3

Możesz użyć String.valueOfmetody.

Na przykład,

char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
String b = String.valueOf(a);
System.out.println("Char Array back to String is: " + b);

Aby uzyskać więcej informacji na temat tablicy znaków do łańcucha, możesz znaleźć linki poniżej

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

https://www.flowerbrackets.com/convert-char-array-to-string-java/

siedmiodniowa żałoba
źródło
2
package naresh.java;

public class TestDoubleString {

    public static void main(String args[]){
        String str="abbcccddef";    
        char charArray[]=str.toCharArray();
        int len=charArray.length;

        for(int i=0;i<len;i++){
            //if i th one and i+1 th character are same then update the charArray
            try{
                if(charArray[i]==charArray[i+1]){
                    charArray[i]='0';                   
                }}
                catch(Exception e){
                    System.out.println("Exception");
                }
        }//finally printing final character string
        for(int k=0;k<charArray.length;k++){
            if(charArray[k]!='0'){
                System.out.println(charArray[k]);
            }       }
    }
}
Ramnaresh Mantri
źródło
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, dlaczego i / lub jak ten kod odpowiada na pytanie, poprawia jego długoterminową wartość.
baikho
1
 //Given Character Array 
  char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};


    //Converting Character Array to String using String funtion     
    System.out.println(String.valueOf(a));
    //OUTPUT : hello world

Konwertowanie dowolnego typu Array na String za pomocą funkcji Java 8 Stream

String stringValue = 
Arrays.stream(new char[][]{a}).map(String::valueOf).collect(Collectors.joining());
Arpan Saini
źródło
1

Spróbuj użyć java.util.Arrays. W tym module dostępnych jest wiele przydatnych metod związanych z tablicami.

Arrays.toString(your_array_here[]);
Adzz
źródło
0

Spróbuj tego

Arrays.toString(array)
Jessica Pereira
źródło
0

Wystarczy użyć String.value lub podobnego poniżej;

  private static void h() {

        String helloWorld = "helloWorld";
        System.out.println(helloWorld);

        char [] charArr = helloWorld.toCharArray();

        System.out.println(String.valueOf(charArr));
    }
Akash Yellappa
źródło
-3

Spróbuj tego:

CharSequence[] charArray = {"a","b","c"};

for (int i = 0; i < charArray.length; i++){
    String str = charArray.toString().join("", charArray[i]);
    System.out.print(str);
}
Curtis H.
źródło
-4

Możesz także użyć klasy StringBuilder

String b = new StringBuilder(a).toString();

Użycie String lub StringBuilder różni się w zależności od wymagań metody.

Jagmeet Singh
źródło
Dlaczego jednak Co zyskujesz na tym?
Casey
-12

1 alternatywny sposób to:

String b = a + "";
Prasanna A.
źródło
3
jest to błędne, ponieważ zakłada, że toStringdziała poprawnie char[]. Może działać na niektórych określonych dostawcach i wersjach JVM.
fommil
3
Ponieważ klasa String jest niezmienna, spowoduje to dwie operacje do wykonania: toString () połączenie ai stworzenie innego obiektu String że Łączy się a.toString()i""
Alpay