Преобразование List <Integer> в список <String>

голоса
86

У меня есть список целых чисел, List<Integer>и я хотел бы преобразовать все целочисленные объекты в строки, таким образом заканчивал с новым List<String>.

Естественно, я мог бы создать новый List<String>и цикл по списку вызывающему String.valueOf()для каждого целого числа, но мне было интересно , если там было лучше (читай: более автоматический ) способ сделать это?

Задан 20/08/2008 в 19:29
источник пользователем
На других языках...                            


19 ответов

голоса
83

Использование Коллекции Google от Гуава-проекта , вы можете использовать transformметод в списках класса

import com.google.common.collect.Lists;
import com.google.common.base.Functions

List<Integer> integers = Arrays.asList(1, 2, 3, 4);

List<String> strings = Lists.transform(integers, Functions.toStringFunction());

ListВозвращаемый transformэто вид в списке основы - преобразование будет применяться при каждом доступе к преобразованному списку.

Имейте в виду , что Functions.toStringFunction()будет бросать NullPointerExceptionпри нанесении на нуль, поэтому используйте его только если вы уверены , что ваш список не будет содержать нуль.

Ответил 04/08/2009 в 13:04
источник пользователем

голоса
66

Насколько я знаю, итерация и Instantiate это единственный способ сделать это. Нечто подобное (для других потенциал помощи, так как я уверен, что вы знаете, как это сделать):

List<Integer> oldList = ...
/* Specify the size of the list up front to prevent resizing. */
List<String> newList = new ArrayList<String>(oldList.size()) 
for (Integer myInt : oldList) { 
  newList.add(String.valueOf(myInt)); 
}
Ответил 20/08/2008 в 19:34
источник пользователем

голоса
55

Решение для Java 8. Немного больше, чем Гуава один, но, по крайней мере, вы не должны установить библиотеку.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

//...

List<Integer> integers = Arrays.asList(1, 2, 3, 4);
List<String> strings = integers.stream().map(Object::toString)
                                        .collect(Collectors.toList());
Ответил 12/04/2014 в 00:52
источник пользователем

голоса
39

То , что вы делаете , это хорошо, но если вы чувствуете необходимость «Java-он-вверх» вы можете использовать трансформатор и оплаченный метод от Apache Commons , например:

public class IntegerToStringTransformer implements Transformer<Integer, String> {
   public String transform(final Integer i) {
      return (i == null ? null : i.toString());
   }
}

..а потом..

CollectionUtils.collect(
   collectionOfIntegers, 
   new IntegerToStringTransformer(), 
   newCollectionOfStrings);
Ответил 21/08/2008 в 02:24
источник пользователем

голоса
9

Источник String.valueOf показывает это:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Не то, чтобы это имеет значение много, но я хотел бы использовать ToString.

Ответил 20/08/2008 в 20:03
источник пользователем

голоса
9

Вместо использования String.valueOf я хотел бы использовать .ToString (); это позволяет избежать некоторое авто бокса описываемого @ johnathan.holland

Javadoc говорит, что valueOf возвращает то же самое, как Integer.toString ().

List<Integer> oldList = ...
List<String> newList = new ArrayList<String>(oldList.size());

for (Integer myInt : oldList) { 
  newList.add(myInt.toString()); 
}
Ответил 20/08/2008 в 19:45
источник пользователем

голоса
8

Вот один вкладыш решение без обмана с библиотекой без JDK.

List<String> strings = Arrays.asList(list.toString().replaceAll("\\[(.*)\\]", "$1").split(", "));
Ответил 25/04/2011 в 19:42
источник пользователем

голоса
5

Другое решение с использованием гуавы и Java 8

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> strings = Lists.transform(numbers, number -> String.valueOf(number));
Ответил 25/04/2014 в 13:38
источник пользователем

голоса
3

Для людей , обеспокоенных «бокс» в ответ jsight в: там нет. String.valueOf(Object)здесь используются, и не распаковка не intбудет когда - либо проводившееся.

Используете ли вы Integer.toString()или String.valueOf(Object)зависит от того, как вы хотите обрабатывать возможные аннулирует. Вы хотите бросить исключение (наверное), или «пустые» строки в списке (возможно). Если первое, то вы хотите , чтобы бросить NullPointerExceptionили какой - либо другой тип?

Кроме того , один небольшой недостаток в ответ jsight в: Listэто интерфейс, вы не можете использовать новый оператор на нем. Я бы , вероятно , использовать java.util.ArrayListв данном случае, тем более , что мы знаем , впереди , как долго список, вероятно, будет.

Ответил 28/08/2008 в 19:35
источник пользователем

голоса
3

Не ядро ​​Java, а не общие маньяки, но популярная Jakarta библиотека Commons коллекция имеют некоторые полезные абстракции для такого рода задачи. В частности, взглянуть на сборных методах на

CollectionUtils

Что-то рассмотреть, если вы уже используете Общины коллекцию в вашем проекте.

Ответил 20/08/2008 в 21:26
источник пользователем

голоса
2

Lambdaj позволяет сделать это в очень простой и читаемым образом. Например, предположим , что у вас есть список Integer , и вы хотите , чтобы преобразовать их в соответствующую строку представления вы могли бы написать что - то подобное;

List<Integer> ints = asList(1, 2, 3, 4);
Iterator<String> stringIterator = convertIterator(ints, new Converter<Integer, String> {
    public String convert(Integer i) { return Integer.toString(i); }
}

Lambdaj применяет функцию преобразования только тогда, когда вы итерация на результат.

Ответил 07/03/2010 в 13:40
источник пользователем

голоса
2

Ответ только для специалистов:

    List<Integer> ints = ...;
    String all = new ArrayList<Integer>(ints).toString();
    String[] split = all.substring(1, all.length()-1).split(", ");
    List<String> strs = Arrays.asList(split);
Ответил 11/09/2008 в 21:40
источник пользователем

голоса
2

Я думаю, с помощью Object.toString () для любых целей, кроме отладки, вероятно, очень плохая идея, даже если в этом случае два функционально эквивалентны (предполагается, что список не имеет аннулирует). Разработчики могут свободно изменять поведение любого метода ToString () без какого-либо предупреждения, в том числе ToString () методов любых классов в стандартной библиотеке.

Даже не беспокоиться о проблемах производительности, вызванные / распаковки процесса бокса. Если производительность критична, просто использовать массив. Если это действительно критично, не используют Java. Пытаясь перехитрить JVM только приведет к душевной боли.

Ответил 20/08/2008 в 19:53
источник пользователем

голоса
2

@ Джонатан: Я могу ошибаться, но я считаю, что String.valueOf () в этом случае будет вызывать функцию String.valueOf (Object) вместо того, чтобы боксировал в String.valueOf (INT). String.valueOf (Object) просто возвращает значение «NULL», если она равна нулю или вызывает Object.toString (), если не нулевой, которая не должна включать в себя бокс (хотя, очевидно, инстанцировании новые строковые объекты участвует).

Ответил 20/08/2008 в 19:42
источник пользователем

голоса
1

Вы не можете избежать «бокс накладных расходов»; искусственные общие контейнеры Java могут хранить только объекты, так что ваши Интс должно быть загнали Целые. В принципе это может избежать опущенного из объекта в целое (так как это бессмысленно, потому что объект достаточно хорош как для String.valueOf и Object.ToString), но я не знаю, если компилятор достаточно умен, чтобы сделать это. Преобразование из строки в объект не должен быть более или менее не-оп, так что я бы не склонен беспокоиться о том, что один.

Ответил 20/08/2008 в 21:25
источник пользователем

голоса
0

Я не видел ни одного решения, которое следует за основной космической сложности. Если список целых чисел имеет большое количество элементов, то это большая проблема.

It will be really good to remove the integer from the List<Integer> and free
the space, once it's added to List<String>.

Мы можем использовать итератор для достижения того же.

    List<Integer> oldList = new ArrayList<>();
    oldList.add(12);
    oldList.add(14);
    .......
    .......

    List<String> newList = new ArrayList<String>(oldList.size());
    Iterator<Integer> itr = oldList.iterator();
    while(itr.hasNext()){
        newList.add(itr.next().toString());
        itr.remove();
    }
Ответил 29/08/2017 в 16:27
источник пользователем

голоса
0

Это такая базовая вещь, чтобы сделать, я бы не использовать внешнюю библиотеку (это будет вызывать зависимость в проекте, который вы, вероятно, не нужно).

У нас есть класс статических методов, специально разработанный, чтобы сделать эти рода работ. Поскольку код это так просто мы позволяем Hotspot сделать оптимизацию для нас. Это, кажется, тема в моем коде недавно: написать очень простой (простой) код и пусть Hotspot делать свою магию. Мы редко возникают проблемы с производительностью вокруг кода, как это - когда новая версия VM приходит вместе вы получаете все дополнительные преимущества скорости и т.д.

Столько, сколько я люблю коллекции Джакарты, они не поддерживают дженериков и использовать 1.4 в качестве ЖК-дисплея. Я настороженно относятся к коллекции Google, потому что они перечислены в качестве уровня поддержки Альфа!

Ответил 24/09/2008 в 08:27
источник пользователем

голоса
0

Просто для удовольствия, решение с помощью jsr166y вилки присоединиться рамки, которые должны в JDK7.

import java.util.concurrent.forkjoin.*;

private final ForkJoinExecutor executor = new ForkJoinPool();
...
List<Integer> ints = ...;
List<String> strs =
    ParallelArray.create(ints.size(), Integer.class, executor)
    .withMapping(new Ops.Op<Integer,String>() { public String op(Integer i) {
        return String.valueOf(i);
    }})
    .all()
    .asList();

(Отказ от ответственности:. Не компилируется Spec не завершена т.д.).

Вряд ли будет в JDK7 немного логического вывода типа и синтаксического сахара, чтобы сделать что withMapping вызов менее многословным:

    .withMapping(#(Integer i) String.valueOf(i))
Ответил 14/09/2008 в 22:25
источник пользователем

голоса
-1

Я просто хотел, чтобы звонить в с объектно-ориентированным решением проблемы.

Если вы модель объектов домена, то решение в предметной области. Домен здесь является списком целых чисел, для которых мы хотим строковые значения.

Проще всего было бы не преобразовать список вообще.

Это, как говорится, для того, чтобы преобразовать без преобразования, изменения в первоначальный список Integer к списку стоимости, где стоимость выглядит примерно так ...

class Value {
    Integer value;
    public Integer getInt()
    {
       return value;
    }
    public String getString()
    {
       return String.valueOf(value);
    }
}

Это будет быстрее и занимает меньше памяти, чем при копировании списка.

Удачи!

Ответил 07/09/2012 в 18:40
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more