Comment reconvertir un tableau de caractères en chaîne?


405

J'ai un tableau de caractères:

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

Ma solution actuelle est de faire

String b = new String(a);

Mais il y a sûrement une meilleure façon de le faire?


151
Pourquoi pensez-vous qu'il existe une meilleure façon? Et ne m'appelez pas Shirley. :)
Hovercraft Full Of Eels

Parce que j'associe toujours la création de nouvelles variables comme celles ci-dessus pour avoir une légère surcharge pendant l'exécution. Comme si je mettais la ligne ci-dessus pour convertir un tableau de caractères en une chaîne en une boucle for par exemple, pour moi, cela ne semble pas tout à fait correct. Et oui, je suis un peu perfectionniste. . .
chutsu

1
Si vous avez beaucoup de ces types, disons un tableau ou une collection de char [], alors peut-être que vous ajouteriez les tableaux de char à un StringBuffer, mais pour une chaîne ici ou là, ce que vous avez publié est ce qui est le plus utilisé.
Aéroglisseur plein d'anguilles

Si vous cherchez un moyen d'éviter de copier le caractère [], il n'y en a pas. Sinon, vous pourriez renverser l'immuabilité de String.
Paul Cager

13
«créer de nouvelles variables» n'entraîne aucun frais généraux. Une variable est un nom utilisé pour faire référence à une valeur, et le nom lui-même n'est présent nulle part en mémoire au moment de l'exécution (du moins, pas dans un langage comme Java où la réflexion est assez limitée). La «surcharge» vient de la construction d'une nouvelle valeur , et il n'y a aucun moyen de contourner cela dans votre cas, étant donné que votre problème est de «construire cette valeur». Vous ne pouvez pas provoquer la transmogrification magique du tableau de caractères en une chaîne. Vous pouvez faire en sorte que le tableau de caractères d'origine soit récupéré après la création de la chaîne.
Karl Knechtel

Réponses:


212

Non, cette solution est absolument correcte et très minime.

Notez cependant qu'il s'agit d'une situation très inhabituelle: étant donné qu'il Stringest géré spécialement en Java, même "foo"est en fait un String. Ainsi, la nécessité de diviser une chaîne en chars individuels et de les rejoindre n'est pas requise dans le code normal.

Comparez cela à C / C ++ où "foo"vous avez un paquet de chars terminé par un octet zéro d'un côté et stringde l'autre côté et de nombreuses conversions entre elles dues aux méthodes héritées.


146

String text = String.copyValueOf(data);

ou

String text = String.valueOf(data);

est sans doute mieux (encapsule l' new Stringappel).


6
Les deux méthodes appellent String(char[])ou une variante de cela. Et la copie se fait à l'intérieur String(char[]). Cela ne laisse aucun avantage à un appel direct en plus de la symétrie avec les autres valueOfméthodes.
AH

1
statique et plus POO est une contradiction de termes. Tout ce qui est déclaré statique ne fait pas partie d'un objet ou de son comportement et n'est donc pas orienté objet. En plus de cela - s'il y a une chance que l'implémentation de Stringsoit modifiée et / ou améliorée de manière incompatible ou que plusieurs implémentations concurrentes puissent être choisies au moment de l'exécution, alors une méthode d'usine statique est logique. Cela ne se produira pas avec une chose de si bas niveau String. Par conséquent, ma prémisse est la suivante: utilisez le plus petit marteau approprié, pas le plus grand disponible.
AH

@AH, je n'en sais rien. String a cédé la place à StringBuffer qui a cédé la place à StringBuilder. Je parie que les partisans de StringBuffer ont dit la même chose à l'époque, et doivent maintenant refactoriser le code pour utiliser StringBuilder.
corsiKa

1
@AH Le fait qu'ils aient dû créer l' CharSequenceinterface montre à quel point votre "ne se produira pas avec des trucs de bas niveau comme la chaîne" - ils ne changent pas ce qui se passe dans la chaîne parce qu'ils s'y sont liés tôt, et maintenant ils souhaitent ils n'auraient pas.
corsiKa

1
@corsiKa Je n'ai pas dit que l'API String est bonne et dorée. Seulement cela ne changera pas de manière incompatible et que la classe elle-même et ses constructeurs n'iront nulle part. :-)
AH

37

Cela convertira le tableau de caractères en chaîne:

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

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

Maintenant, pour convertir un tableau de caractères en chaîne, il y a deux façons.

Arrays.toString(c);

Renvoie la chaîne [w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v].

Et:

String.valueOf(c)

Renvoie la chaîne wwwwww3333dfevvv.

En résumé : faites attention Arrays.toString(c), car vous obtiendrez "[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"au lieu de "wwwwww3333dfevvv".


7

Une chaîne en java n'est qu'un objet autour d'un tableau de caractères. D'où un

char[]

est identique à une chaîne non encadrée avec les mêmes caractères. En créant une nouvelle chaîne à partir de votre tableau de caractères

new String(char[])

vous dites essentiellement au compilateur d'autoboxer un objet String autour de votre tableau de caractères.



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

Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant pourquoi et / ou comment ce code répond à la question améliore sa valeur à long terme.
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

Conversion d'un type de tableau donné en chaîne à l'aide de la fonction Java 8 Stream

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

1

Essayez d'utiliser java.util.Arrays. Ce module a une variété de méthodes utiles qui pourraient être utilisées concernant les tableaux.

Arrays.toString(your_array_here[]);


0

Utilisez simplement String.value comme ci-dessous;

  private static void h() {

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

        char [] charArr = helloWorld.toCharArray();

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

-3

Essaye ça:

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

Vous pouvez également utiliser la classe StringBuilder

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

L'utilisation de String ou StringBuilder varie selon les exigences de votre méthode.


Mais pourquoi? Qu'obtenez-vous en faisant cela?
Casey

-12

Une autre façon est de faire:

String b = a + "";

3
c'est faux car cela suppose que cela toStringfonctionne correctement char[]. Il peut fonctionner sur certains fournisseurs et versions spécifiques de la machine virtuelle Java.
fommil

3
Étant donné que la classe String est immuable, cela entraînera l'exécution de deux opérations: l'appel toString () aet la création d'un autre objet String qui concatène avec a.toString()et""
Alpay
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.