Есть ли полезный метод для создания списка с указанным размером и содержанием?

public static <T> List<T> repeat(T contents, int length) {
    List<T> list = new ArrayList<T>();
    for (int i = 0; i < length; i++) {
        list.add(contents);
    }
    return list;
}

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

Есть ли где-нибудь в java / apache-commons служебный класс, который уже делает это? Я просмотрел ListUtils, CollectionUtils, Arrays, Collections, почти все, что мог придумать, но нигде не могу его найти. Я не люблю хранить в своем коде универсальные служебные методы, если это возможно, поскольку они обычно избыточны с помощью библиотек apache.

3 ответа

Решение

Класс Util Collection поможет вам

list = Collections.nCopies(length,contents);

или если вы хотите изменяемый список

list = new ArrayList<T>(Collections.nCopies(length,contents));

Google Guava имеет следующее:

newArrayListWithExpectedSize(int estimatedSize)

а также:

newArrayList(E... elements)

но вы не можете сделать и то и другое, возможно, отправьте патч, если он будет полезен. Больше информации здесь:

http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Lists.html

Как насчет java.util.Arrays.asList?

Вы можете просто передать содержимое как var-arg:

List<String> planets = Arrays.asList( "Mercury", "Venus", "Earth", "Mars" );

Имейте в виду, вы также можете передать в массиве:

String[] ps = new String[]{ "Mercury", "Venus", "Earth", "Mars" };
List<String> planets = Arrays.asList( ps );

но он "поддерживается" массивом, так как изменение содержимого массива будет отражено в списке:

String[] ps = new String[]{ "Mercury", "Venus", "Earth", "Mars" };
List<String> planets = Arrays.asList( ps );
ps[3] = "Terra";
assert planets.get(3).equals( "Terra" );
Другие вопросы по тегам