반복되는 요소로 목록 만들기


83

모든 요소가 지정된 값 (예 : [ "foo", "foo", "foo", "foo", "foo"])과 동일한 지정된 길이의 목록 또는 배열을 생성하는 Java에 유틸리티 메소드가 있습니까?

답변:


144

사용할 수 있습니다 Collections.nCopies. 이것은 객체 자체가 아니라 주어진 객체에 대한 참조 를 복사합니다 . 문자열로 작업하는 경우 어쨌든 불변이기 때문에 중요하지 않습니다.

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

20

배열의 경우 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

매우 간단합니다 : Collections.nCopies (5, "foo") Thkns!
Marcelo Rebouças

4

기본 배열에 사용할 수있는 버전 (Java 8) :

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

반환 double[]하지 않습니다.Double[]

IntegerStream, DoubleStream, LongStream에서 작동


1

를 사용하면 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

개체가 변경 불가능하거나 참조 투명하지 않은 경우 다음을 사용할 수 있습니다.

Stream.generate(YourClass::new).limit(<count>)

목록으로 수집

.collect(Collectors.toList())

또는 배열

.toArray(YourClass[]::new)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.