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?


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.


146

String text = String.copyValueOf(data);

lub

String text = String.valueOf(data);

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


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

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".


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.



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

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

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[]);


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

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

-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.


Dlaczego jednak Co zyskujesz na tym?
Casey

-12

1 alternatywny sposób to:

String b = a + "";

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.