У меня есть, ArrayList
что я хочу вывести полностью в виде строки. По сути, я хочу вывести его по порядку, используя toString
каждый элемент, разделенный вкладками. Есть ли быстрый способ сделать это? Вы можете пройти через него (или удалить каждый элемент) и объединить его в строку, но я думаю, что это будет очень медленно.
353
Ответы:
По сути, использование цикла для итерации
ArrayList
является единственным вариантом:НЕ используйте этот код, продолжайте чтение до конца этого ответа, чтобы понять, почему это нежелательно, и какой код следует использовать вместо:
На самом деле, конкатенация строк будет в порядке, так как
javac
компиляторappend
вStringBuilder
любом случае оптимизирует конкатенацию строк как последовательность операций . Вот часть разборки байт-кода изfor
цикла из вышеуказанной программы:Как видно, компилятор оптимизирует этот цикл с помощью
StringBuilder
, поэтому производительность не должна быть большой проблемой.(Хорошо, на второй взгляд,
StringBuilder
экземпляр создается на каждой итерации цикла, поэтому он может быть не самым эффективным байт-кодом. Создание и использование явногоStringBuilder
, вероятно, даст лучшую производительность.)На самом деле, я думаю, что вывод любого типа (будь то на диск или на экран) будет как минимум на порядок медленнее, чем необходимость беспокоиться о производительности конкатенации строк.
Редактировать: Как указано в комментариях, приведенная выше оптимизация компилятора действительно создает новый экземпляр
StringBuilder
каждой итерации. (Который я отметил ранее.)Наиболее оптимизированным методом для использования будет ответ Пола Томблина , поскольку он только создает экземпляр одного
StringBuilder
объекта внеfor
цикла.Переписав код выше, чтобы:
Будет создан экземпляр только
StringBuilder
один раз за пределами цикла, и будут только два вызоваappend
метода внутри цикла, как показано в этом байт-коде (который показывает создание экземпляраStringBuilder
и цикла):Таким образом, на самом деле ручная оптимизация должна быть более эффективной, поскольку внутренняя часть
for
цикла короче и нет необходимости создавать экземпляр aStringBuilder
на каждой итерации.источник
Java
или Geewax дляAndroid
В Java 8 или более поздней версии:
Если
list
тип не String, может использоваться объединяющий коллектор:источник
Если вы делаете это на Android, для этого есть хорошая утилита TextUtils, у которой есть
.join(String delimiter, Iterable)
метод.Очевидно, что за пределами Android пользы мало, но я решил добавить его в эту ветку ...
источник
TextUtils.join
принимаетObject[]
, я предполагаю, что он вызываетtoString()
на каждом токене.PatientDetails
Реализует лиtoString()
? Если это не решит проблему, возможно, вы застряли, делая что-то сSeparator
классом.org.apache.lang3.StringUtils
делает практически то же самое, так что ваш ответ был абсолютно полезным для меня за пределами Android :)Скачайте Apache Commons Lang и используйте метод
Конечно, вы можете реализовать это самостоятельно, но их код полностью протестирован и, вероятно, является наилучшей из возможных реализаций.
Я большой поклонник библиотеки Apache Commons и считаю, что это отличное дополнение к стандартной библиотеке Java.
источник
StringUtils.join(list.toArray(),"\t")
Это довольно старый вопрос, но я думаю, я мог бы также добавить более современный ответ - использовать
Joiner
класс из Guava :источник
Изменение List на читаемую и значимую String - это действительно распространенный вопрос, с которым может столкнуться каждый.
Случай 1 . Если в вашем пути к классам есть Apache StringUtils (как в rogerdpack и Ravi Wallau):
Случай 2 . Если вы хотите использовать только пути из JDK (7):
Просто никогда не создавайте колеса самостоятельно, не используйте петли для этой задачи в одну строку.
источник
Arrays.toString(myList.toArray())
- самое простое и понятное решениеArrays.toString(list.toArray())
легко написать, но крайне неэффективно.Если вы искали быструю однострочную версию, то в Java 5 вы можете сделать это:
Кроме того, если ваша цель - просто распечатать содержимое и меньше беспокоиться о «\ t», вы можете просто сделать это:
который возвращает строку как
Если у вас есть Array (не ArrayList), вы можете сделать то же самое, как это:
источник
m
домашних хозяйствах вn
городах вx
штатах, вы скажете, что этоO(mnx)
илиO(n^3)
, но я могу перефразировать его, чтобы сказать: «Ищите этого человека в этой стране», и вы сразу же скажете мнеO(n)
. Кроме того, все алгоритмы здесь, как правилоO(n)
, не имеют циклов внутри цикла.Переберите его и вызовите toString. Волшебного пути нет, и если бы он был, что, по вашему мнению, он делал бы под покровом, кроме как проходить через него? Единственной микрооптимизацией было бы использование StringBuilder вместо String, и даже это не является огромным выигрышем - объединение строк превращается в StringBuilder под крышками, но, по крайней мере, если вы напишите его таким образом, вы сможете увидеть, что происходит.
источник
Большинство проектов Java часто имеют доступ к Apache-Commons Lang. Методы StringUtils.join () очень хороши и имеют несколько разновидностей, чтобы удовлетворить почти все потребности.
источник
join(...)
метод имеет варианты как для массивов, так и для коллекций.В Android есть класс TextUtil, который вы можете использовать http://developer.android.com/reference/android/text/TextUtils.html
источник
Для этого простого варианта использования вы можете просто соединить строки запятой. Если вы используете Java 8:
в противном случае commons-lang имеет метод join ():
источник
Элегантный способ справиться с конечными символами разделения - использовать Class Separator
Метод toString класса Separator возвращает разделитель, за исключением первого вызова. Таким образом, мы печатаем список без конечных (или в этом случае) ведущих разделителей.
источник
В Java 8 все просто. Смотрите пример для списка целых чисел:
Или многострочная версия (которую проще читать):
Обновление - более короткая версия
источник
filter
. В конце концов, мне намного легче читать код.String
тоже. Если это списокInteger
s у вас есть проблемыЭто
O(n)
любом случае алгоритм (если только вы не какое-то многопоточное решение, в котором вы разбили список на несколько подсписков, но я не думаю, что вы об этом просите).Просто используйте
StringBuilder
как ниже:Это
StringBuilder
будет намного быстрее, чем конкатенация строк, потому что вы не будете повторно создавать экземплярString
объекта при каждой конкатенации.источник
Если вы оказались на Android и еще не используете Jack (например, потому что по-прежнему отсутствует поддержка Instant Run), и если вам нужен больший контроль над форматированием результирующей строки (например, вы хотите использовать символ новой строки как разделитель элементов), и если вы используете / хотите использовать библиотеку StreamSupport (для использования потоков в Java 7 или более ранних версиях компилятора), вы можете использовать что-то вроде этого (я поместил этот метод в мой класс ListUtils):
И, конечно же, обязательно реализуйте toString () в классе объектов списка.
источник
reduce
крайне неэффективно для конкатенации строк. Вы должны сделать это способом Java 8,return StreamSupport.stream(list).map(Object::toString).collect(joining("\n"))
который внутренне используетStringJoiner
. Нет причин, по которым вы не могли бы сделать это с помощью streamsupport .Optional#get
), если ему передадут пустой список.Если вы не хотите, чтобы последний \ t после последнего элемента, вы должны использовать индекс для проверки, но помните, что это только «работает» (то есть O (n)), когда списки реализуют RandomAccess.
источник
Код ниже может помочь вам,
Вывод:
источник
Может быть, не самый лучший, но элегантный способ.
Arrays.deepToString (Arrays.asList ("Test", "Test2")
Вывод
[Test, Test2]
источник
Будет ли следующее хорошо:
источник
Если вы используете Eclipse Collections , вы можете использовать
makeString()
метод.Если вы можете конвертировать ваши
ArrayList
вFastList
, вы можете избавиться от адаптера.Примечание: я являюсь коммиттером для Eclipse Collections.
источник
Вы переходите к
new StringJoiner
последовательности символов, которую хотите использовать в качестве разделителя. Если вы хотите сделать CSV:new StringJoiner(", ");
источник
В одну строку: с [12,0,1,78,12] до 12 0 1 78 12
источник
Для разделения с помощью вкладок вместо println вы можете использовать print
источник
Я вижу довольно много примеров, которые зависят от дополнительных ресурсов, но кажется, что это было бы самое простое решение: (это то, что я использовал в моем собственном проекте), которое в основном просто конвертирует из ArrayList в Array, а затем в List ,
источник
Это довольно старый разговор, и теперь Apache Commons использует StringBuilder для внутреннего использования: http://commons.apache.org/lang/api/src-html/org/apache/commons/lang/StringUtils.html#line. 3045
Это, как мы знаем, улучшит производительность, но если производительность критична, то используемый метод может быть несколько неэффективным. Принимая во внимание, что интерфейс является гибким и допускает согласованное поведение для различных типов Коллекции, он несколько неэффективен для Списков, который является типом Коллекции в первоначальном вопросе.
Я основываю это на том, что мы несем некоторые издержки, которых мы бы избежали, просто перебирая элементы в традиционном цикле for. Вместо этого есть некоторые дополнительные вещи, происходящие за кулисами, проверяющие одновременные модификации, вызовы методов и т. Д. Усовершенствованный цикл for, с другой стороны, приведет к тем же издержкам, так как итератор используется для объекта Iterable (Список).
источник
Вы можете использовать Regex для этого. Это так кратко, как это становится
источник
Как насчет этой функции:
это работает для любого типа коллекции ...
источник