Есть ли полезный метод для создания списка с указанным размером и содержанием?
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" );