Лучший способ конвертировать ArrayList of Character в String - PullRequest
2 голосов
/ 12 января 2012

Я хочу преобразовать ArrayList of Character в String.Я прочитал похожую ветку, как Лучший способ преобразовать ArrayList в строку , но я хочу более простой способ.

Я пробовал это

List<Character> chars = new ArrayList<Character>();
...
Character[] charArray = (Character[]) chars.toArray();
String output = new String(charArray); // error

Но это не сработалопотому что конструктор new String() принимает только char[] в качестве параметра.Я не мог легко конвертировать chars или charArray в char[].

Нет ли простого способа?Или мне нужно выполнить итерацию, чтобы создать строку?

Ответы [ 5 ]

4 голосов
/ 12 января 2012

Это примерно так просто:

StringBuilder result = new StringBuilder(chars.size());
for (Character c : chars) {
  result.append(c);
}
String output = result.toString();
3 голосов
/ 12 января 2012

Да, к сожалению, вам придется повторяться.

char[] cs = new char[chars.size()];

for(int i = 0; i < cs.length; i++) {
    cs[i] = chars.get(i);
}

String output = new String(cs);
2 голосов
/ 03 ноября 2017

Я только что провёл несколько тестов, так как меня интересовало, каким будет самый быстрый способ. Я использовал 4 разных метода, каждый раз 1 000 000 (1 миллион) раз для правильной оценки.

Примечание:

  • ArrayList был заполнен 2710 символами,
  • вводом была какая-то случайная строка json, вокруг которой я лежал,
  • мой компьютер не самый сильный (процессор: AMD Phenom II X4 955 @ 3,20 ГГц).

1) Преобразовать в массив, затем в строку (ответ адарша)

char[] cs = new char[chars.size()];
for(int x = 0; x < cs.length; x++){
    cs[x] = chars.get(x);
}
String output = new String(cs);

Время: 7716056685 наносекунд или ~ 7,7 секунд / индекс: 1


2) Используйте StringBuilder С предопределенным размером для сбора каждого символа (ответ Шона Оуэна)

StringBuilder result = new StringBuilder(chars.size());
for(Character c : chars){
    result.append(c);
}
String output = result.toString();

Время: 77324811970 наносекунд или ~ 77,3 секунд / индекс: ~ 10


3) Используйте StringBuilder БЕЗ предопределенного размера для сбора каждого символа

StringBuilder result = new StringBuilder();
for(Character c : chars){
    result.append(c);
}
String output = result.toString();

Время: 87704351396 наносекунд или ~ 87,7 секунд / индекс: ~ 11,34


4) Создайте и очистите строку и просто + = каждый персонаж (ответ Джонатана Гранди)

String output = "";
for(int x = 0; x < cs.length; x++){
    output += chars.get(x);
}

Время: 4387283410400 наносекунд или ~ 4387,3 секунд / индекс: ~ 568,59

Я действительно должен был уменьшить это. Этот метод был запущен только 10000 раз, что уже заняло ~ 43 секунды, я просто умножил результат на 100, чтобы получить приближение 1.000.000 прогонов

Conclussion:

Используйте метод "Преобразовать в массив, затем в строку" ... это быстро ... С другой стороны, я бы не подумал, что операция + = будет такой медленной ...

Как я тестировал:

final String jsonExample = new String("/* Random Json String here */");
final char[] charsARRAY = jsonExample.toCharArray();
final ArrayList<Character> chars = new ArrayList<Character>();
for(int i = 0; i < charsARRAY.length; i++){
    chars.add(charsARRAY[i]);
}
final long time1, time2;
final int amount = 1000000;

time1 = System.nanoTime();

for(int i = 0; i < amount; i++){
    // Test method here
}

time2 = System.nanoTime();
2 голосов
/ 03 июня 2017

Простой способ - добавить каждый символ в строку:

String myString = "";
for (Character c : charList) {
    myString += c;
}

Это повторяет список для добавления каждого символа.

Результат:

Вывод charList: [a, b, c]. Вывод myString: abc.

0 голосов
/ 16 мая 2015

Попробуйте гуаву:

Joiner.on("").join(chars);

или общий язык:

StringUtils.join(chars, null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...