Karakter dizisini dizgeye nasıl dönüştürebilirim?


405

Bir char dizi var:

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

Şu anki çözümüm

String b = new String(a);

Ama elbette bunu yapmanın daha iyi bir yolu var mı?


151
Neden daha iyi bir yol olduğunu düşünüyorsunuz? Ve bana Shirley demeyin. :)
Hovercraft Eels Dolu

Çünkü çalışma zamanı boyunca her zaman yukarıdaki gibi yeni değişkenler oluşturmakla başa çıkıyorum. Eğer bir karakter dizisini bir for döngüsüne bir dizeye dönüştürmek için yukarıdaki satırı koyduğum gibi, bana doğru görünmüyor. Ve evet ben biraz mükemmeliyetçiyim. . .
chutsu

1
Bu adamlardan birçoğunuz varsa, bir dizi veya char [] koleksiyonu söylerseniz, belki de char dizilerini bir StringBuffer'a eklersiniz, ancak burada veya orada bir String için yayınladığınız şey en çok kullandığınız şeydir.
Hovercraft Eels Dolu

Char [] 'i kopyalamaktan kaçınmanın bir yolunu arıyorsanız o zaman biri yoktur. Aksi takdirde String'in değişmezliğini bozabilirsiniz.
Paul Cager

13
"yeni değişkenler yapmak" sıfır ek yüke neden olur. Değişken, bir değere başvurmak için kullanılan bir addır ve adın kendisi çalışma zamanında bellekte hiçbir yerde yoktur (en azından yansımanın oldukça sınırlı olduğu Java gibi bir dilde değil). "Genel gider" yeni bir değer oluşturmaktan kaynaklanır ve sizin durumunuzda, bu sorunun "bu değeri yapılandırın" olduğunu düşünmenin bir yolu yoktur. Char dizisinin sihirli bir şekilde bir String'e aktarılmasına neden olamazsınız. Sen edebilirsiniz Dize oluşturulduktan sonra orijinal karakter dizisi çöp toplama işlemi yapılmasını düzenleyecektir.
Karl Knechtel

Yanıtlar:


212

Hayır, bu çözüm kesinlikle doğru ve çok az.

Ancak, bunun çok sıra dışı bir durum olduğunu unutmayın: Çünkü StringJava'da özel olarak ele alındığında "foo", aslında bir String. Bu nedenle, bir String'i tek tek chars'ye bölüp tekrar birleştirmek normal kodda gerekli değildir.

Bunu , bir tarafta ve diğer tarafta sıfır baytla sonlandırılmış bir s "foo"demetiniz ve eski yöntemler nedeniyle aralarındaki birçok dönüşümün olduğu C / C ++ ile karşılaştırın .charstring


146

String text = String.copyValueOf(data);

veya

String text = String.valueOf(data);

tartışmasız daha iyidir ( new Stringçağrıyı kapsar).


6
Her iki yöntem String(char[])de bunun bir varyantını çağırır . Ve kopya kısmı içeride yapılır String(char[]). Bu, diğer valueOfyöntemlerle simetrinin yanı sıra doğrudan bir çağrıya hiçbir fayda sağlamaz .
AH

1
statik ve daha fazla OOP terimlerin çelişkisidir. Statik olarak bildirilen hiçbir şey bir nesnenin veya davranışının parçası değildir ve bu nedenle nesneye yönelik değildir. Bunun yanı sıra - uygulamanın uygulanmasının Stringuyumsuz bir şekilde değiştirilmesi ve / veya geliştirilmesi şansı varsa veya çalışma zamanında birkaç rakip uygulama seçilebiliyorsa, statik bir fabrika yöntemi mantıklıdır. Bu, böyle düşük seviyeli bir şeyle olmayacak String. Bu yüzden benim öncülüm: Mevcut en büyük çekiç değil, uygun en küçük çekiç kullanın.
AH

@AH bunu bilmiyorum. String, StringBuilder'a yol veren StringBuffer'a yol verdi. Bahse girerim StringBuffer taraftarları aynı şeyi söyledi ve şimdi StringBuilder kullanmak için kodu refactor zorunda.
corsiKa

1
@AH CharSequenceArayüzü oluşturmak zorunda olmaları gerçeği, "string gibi düşük seviyeli şeylerle olmayacak" nızın ne kadar kusurlu olduğunu gösterir - dizgide neler olduğunu değiştirmezler çünkü kendilerini erken bağlarlar ve şimdi isterler olmazdı.
corsiKa

1
@corsiKa Dize API tüm iyi ve altın olduğunu söylemedim. Sadece uyumsuz bir şekilde değişmeyecek ve sınıfın kendisi ve kurucuları hiçbir yere gitmeyecek. :-)
AH

37

Bu char dizisini dizgiye geri dönüştürür:

char[] charArray = {'a', 'b', 'c'};
String str = String.valueOf(charArray);

14
String str = "wwwwww3333dfevvv";
char[] c = str.toCharArray();

Şimdi karakter dizisini String'e dönüştürmek için iki yol var.

Arrays.toString(c);

Dizeyi döndürür [w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v].

Ve:

String.valueOf(c)

Dizeyi döndürür wwwwww3333dfevvv.

Özetle : dikkat edin Arrays.toString(c), "[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"bunun yerine alacaksınız "wwwwww3333dfevvv".


7

Java'daki bir String yalnızca karakter dizisi etrafındaki bir nesnedir. Dolayısıyla bir

char[]

, aynı karakterlere sahip kutulanmamış bir Dize ile aynıdır. Karakter dizinizden yeni bir String oluşturarak

new String(char[])

temel olarak derleyiciye bir dizi nesnesini karakter dizinizin etrafına otomatik olarak yerleştirmesini söylersiniz.



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

Bu kod soruyu cevaplayabilirken, bu kodun soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini arttırır.
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

Herhangi bir Dizi türünü Java 8 Stream işlevini kullanarak String'e dönüştürme

String stringValue = 
Arrays.stream(new char[][]{a}).map(String::valueOf).collect(Collectors.joining());

1

Kullanmaya çalışın java.util.Arrays. Bu modül Diziler ile ilgili olarak kullanılabilecek çeşitli faydalı yöntemlere sahiptir.

Arrays.toString(your_array_here[]);


0

Sadece aşağıdaki gibi String.value kullanın;

  private static void h() {

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

        char [] charArr = helloWorld.toCharArray();

        System.out.println(String.valueOf(charArr));
    }

-3

Bunu dene:

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

StringBuilder sınıfını da kullanabilirsiniz

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

String veya StringBuilder kullanımı yöntem gereksinimlerinize göre değişir.


Neden olsa? Bunu yapmaktan ne elde edersiniz?
Casey

-12

1 alternatif yol yapmaktır:

String b = a + "";

3
toStringdoğru çalıştığını varsayarsak bu yanlıştır char[]. JVM'nin bazı belirli satıcıları ve sürümleri üzerinde çalışabilir.
fommil

3
String sınıfı değiştirilemediğinden, bu iki işlemin gerçekleştirilmesine neden olur: toString () çağrısı ave a.toString()ve""
Alpay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.