Як перетворити масив char назад у рядок?


405

У мене є масив char:

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

Моє поточне рішення - це зробити

String b = new String(a);

Але напевно є кращий спосіб зробити це?


151
Чому ви вважаєте, що існує кращий спосіб? І не називайте мене Ширлі. :)
Hovercraft Full Of Eels

Тому що я завжди пов'язую створення нових змінних, таких як наведені вище, щоб мати невелику голову під час виконання. Як, наприклад, якщо я ставлю вищенаведений рядок для перетворення масиву char у рядок у цикл for, наприклад, для мене це виглядає не так правильно. І так, я трохи перфекціоніст. . .
чуцу

1
Якщо у вас є багато цих хлопців, скажімо, масив чи колекція char [], можливо, ви додали б масиви char до StringBuffer, але для String тут чи там ви розмістили те, що найбільше використовуєте.
Hovercraft Full Of Eels

Якщо ви шукаєте спосіб уникнути копіювання знаку [], то його немає. Інакше ви можете зірвати незмінність String.
Пол Кагер

13
"створення нових змінних" несе накладні витрати. Змінна - це ім'я, яке використовується для позначення значення, а саме ім'я ніде не зберігається в пам'яті під час виконання (принаймні, не на такій мові, як Java, де відображення досить обмежене). "Накладні витрати" походять від побудови нового значення , і у вашому випадку це не обійтися, враховуючи, що ваша проблема - "побудувати це значення". Ви не можете змусити масив char магічно перетворитись у String. Ви можете домовитись, щоб оригінальний масив char збирався зі сміттям після створення String.
Карл Кнечтел

Відповіді:


212

Ні, це рішення абсолютно правильне і дуже мінімальне.

Однак зауважте, що це дуже незвична ситуація: оскільки Stringобробляється спеціально на Java, навіть "foo"це фактично String. Отже, необхідність розбиття рядка на окремі chars та об'єднання їх у звичайному коді не потрібна.

Порівняйте це з C / C ++, де у "foo"вас є пакет chars, що закінчується нульовим байтом на одній і stringіншій стороні, і багато перетворень між ними належними методам, що застаріли.


146

String text = String.copyValueOf(data);

або

String text = String.valueOf(data);

це, мабуть, краще (інкапсулює new Stringдзвінок).


6
Обидва методи викликають String(char[])або варіант цього. А копіювальна частина робиться всередині String(char[]). Це не залишає користі для прямого виклику, крім симетрії з іншими valueOfметодами.
AH

1
статичні та більше OOP - це суперечність термінів. Все, що оголошено статичним , не є частиною об'єкта або його поведінки, а отже, не орієнтоване на об'єкт. Крім цього - якщо є шанс, що реалізація Stringбуде змінена та / або вдосконалена несумісним способом або декілька конкуруючих реалізацій можуть бути обрані під час виконання, тоді статичний заводський метод має сенс. Це не відбудеться з такою річчю низького рівня, як String. Тому моя передумова: Використовуйте найменший підходящий молоток, а не найбільший із наявних.
AH

@AH Я не знаю про це. String поступився місцем StringBuffer, який поступився місцем StringBuilder. Б'юсь об заклад, що прихильники StringBuffer сказали те ж саме, і тепер доведеться рефакторний код, щоб використовувати StringBuilder.
corsiKa

1
@AH Той факт, що їм довелося створити CharSequenceінтерфейс, показує, наскільки хибним є ваш "звичай не трапиться з речами на низькому рівні, як рядок" - вони не змінюють того, що відбувається в рядку, тому що вони прив'язали себе до цього рано, і тепер вони хочуть їх не було б.
corsiKa

1
@corsiKa Я не сказав, що String API - це все добре і золото. Тільки те, що він не зміниться несумісним способом, і що сам клас та його конструктори нікуди не подінуться. :-)
AH

37

Це перетворить масив char назад у рядок:

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

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

Тепер для перетворення масиву символів у String існує два способи.

Arrays.toString(c);

Повертає рядок [w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v].

І:

String.valueOf(c)

Повертає рядок wwwwww3333dfevvv.

Підсумок : зверніть увагу Arrays.toString(c), тому що ви отримаєте "[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"замість цього "wwwwww3333dfevvv".


7

Рядок у Java - це лише предмет навколо масиву символів. Звідси a

char[]

є ідентичним unboxed String з тими ж символами. Створюючи нову рядок зі свого масиву символів

new String(char[])

ви, по суті, говорите компілятору автобоксувати об'єкт String навколо вашого масиву символів.


3

Можна використовувати String.valueOfметод.

Наприклад,

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

Для отримання додаткової інформації про масив char до рядка ви можете посилатися нижче

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

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


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

Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення.
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

Перетворення даного типу масиву в String за допомогою функції Java 8 Stream

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

1

Спробуйте використовувати java.util.Arrays. Цей модуль має різноманітні корисні методи, які можуть бути використані стосовно масивів.

Arrays.toString(your_array_here[]);


0

Просто використовуйте String.value, як показано нижче;

  private static void h() {

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

        char [] charArr = helloWorld.toCharArray();

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

-3

Спробуйте це:

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

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

Використання String або StringBuilder залежить від ваших вимог до методу.


Чому хоч? Що ви отримуєте від цього?
Кейсі

-12

1 альтернативний спосіб - це зробити:

String b = a + "";

3
це неправильно, оскільки передбачається, що toStringпрацює правильно char[]. Це може працювати на деяких конкретних постачальниках та версіях JVM.
fommil

3
Оскільки клас String є незмінним, це призведе до виконання двох операцій: виклик toString () aта створення іншого об'єкта String, який об'єднується з a.toString()і""
Alpay
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.