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.
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:
package naresh.java;publicclassTestDoubleString{publicstaticvoid 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 charArraytry{if(charArray[i]==charArray[i+1]){
charArray[i]='0';}}catch(Exception e){System.out.println("Exception");}}//finally printing final character stringfor(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
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""
Odpowiedzi:
Nie, to rozwiązanie jest absolutnie poprawne i bardzo minimalne.
Zauważ jednak, że jest to bardzo nietypowa sytuacja: ponieważ
String
jest obsługiwany specjalnie w Javie, nawet"foo"
tak naprawdę jestString
. Tak więc potrzeba podzielenia ciągu na poszczególnechar
litery i dołączenia ich z powrotem nie jest wymagana w normalnym kodzie.Porównaj to do C / C ++, gdzie
"foo"
masz pakietchar
s zakończony bajtem zerowym po jednej stronie istring
po drugiej stronie oraz wiele konwersji między nimi ze względu na starsze metody.źródło
String text = String.copyValueOf(data);
lub
String text = String.valueOf(data);
jest prawdopodobnie lepszy (podsumowuje
new String
połączenie).źródło
String(char[])
lub ich wariant. Część kopiująca jest zrobiona w środkuString(char[])
. Nie pozostawia to żadnych korzyści dla bezpośredniego połączenia poza symetrią z innymivalueOf
metodami.String
zostanie 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, jakString
. Dlatego moim założeniem jest: Użyj najmniejszego odpowiedniego młotka, a nie największego z dostępnych.CharSequence
interfejs, 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.Spowoduje to konwersję tablicy char z powrotem na ciąg znaków:
źródło
Teraz, aby przekonwertować tablicę znaków na String, istnieją dwa sposoby.
Zwraca ciąg
[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]
.I:
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"
.źródło
Łańcuch w java to tylko obiekt wokół tablicy znaków. Stąd a
jest identyczny z rozpakowanym ciągiem zawierającym te same znaki. Tworząc nowy ciąg znaków z tablicy znaków
zasadniczo mówisz kompilatorowi, aby autoboxował obiekt String wokół twojej tablicy znaków.
źródło
Możesz użyć
String.valueOf
metody.Na przykład,
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/
źródło
źródło
Konwertowanie dowolnego typu Array na String za pomocą funkcji Java 8 Stream
źródło
Spróbuj użyć
java.util.Arrays
. W tym module dostępnych jest wiele przydatnych metod związanych z tablicami.źródło
Spróbuj tego
źródło
Wystarczy użyć String.value lub podobnego poniżej;
źródło
Spróbuj tego:
źródło
Możesz także użyć klasy StringBuilder
Użycie String lub StringBuilder różni się w zależności od wymagań metody.
źródło
1 alternatywny sposób to:
źródło
toString
działa poprawniechar[]
. Może działać na niektórych określonych dostawcach i wersjach JVM.a
i stworzenie innego obiektu String że Łączy sięa.toString()
i""