创建一个包含重复元素的列表

139

在Java中是否有一个实用方法,可以生成指定长度的列表或数组,并使所有元素都等于指定值(例如 ["foo", "foo", "foo", "foo", "foo"])?


答案:Java提供了Arrays类中的静态方法,名为fill(),可以生成包含指定元素并指定长度的数组。例如,要创建一个包含5个元素且每个元素均为字符串"foo"的数组,可以使用以下代码:
String[] array = new String[5];
Arrays.fill(array, "foo");
5个回答

229

你可以使用Collections.nCopies。请注意,这将复制给定对象的引用,而不是对象本身。如果您正在使用字符串,则无关紧要,因为它们本身就是不可变的。

List<String> list = Collections.nCopies(5, "foo");
System.out.println(list);
[foo, foo, foo, foo, foo]

2
完美的答案! - Gaurav
1
注意 - 这将返回一个不可变集合 - Gaurav
请注意,即使 n = 0,以下的编程代码也会评估 "foo" - darw

34
对于一个数组,您可以使用Arrays.fill(Object[] a, Object val)
String[] strArray = new String[10];
Arrays.fill(strArray, "foo");

如果您需要一个列表,只需使用

List<String> asList = Arrays.asList(strArray);
那我需要使用两行代码:String[] strArray = new String[5]; Arrays.fill(strArray, "foo");。有没有一行代码的解决方案?
你可以使用Collections.nCopies(5, "foo")作为一行代码的解决方案来获得一个列表:
List<String> strArray = Collections.nCopies(5, "foo");

或者与toArray结合使用以获取数组。

String[] strArray = Collections.nCopies(5, "foo").toArray(new String[5]);

1
那么我必须使用两行:String[] strArray = new String[5]; Arrays.fill(strArray, "foo");。有没有一行的解决方案? - laurt
1
非常简单:Collections.nCopies(5, "foo")。谢谢! - Marcelo Rebouças

18
如果您的对象不是不可变的或者不是引用透明的,您可以使用。
Stream.generate(YourClass::new).limit(<count>)

并将其收集到列表中

.collect(Collectors.toList())

或转换为数组

.toArray(YourClass[]::new)

11

您可以在原始数组中使用的版本(Java 8):

DoubleStream.generate(() -> 123.42).limit(777).toArray(); // returns array of 777 123.42 double vals

请注意,它返回double[],而不是Double[]

适用于IntegerStream,DoubleStream,LongStream

更新

对于字符串重复,您可以使用:

Stream.generate(() -> "value").limit(400).toArray()

无需额外的库,单行代码


9
使用IntStream,您可以生成一系列整数,将它们映射到您想要的元素并将其收集为列表。
List<String> list = IntStream.rangeClosed(0, 5)
            .mapToObj(i -> "foo")
            .collect(Collectors.toList());

或者,作为一个数组

 String[] arr = IntStream.rangeClosed(0, 5)
            .mapToObj(i -> "foo")
            .toArray(String[]::new);

1
表现完美无瑕 - Gaurav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接