Tạo danh sách với phần tử lặp lại


82

Có phương thức tiện ích nào trong Java tạo danh sách hoặc mảng có độ dài được chỉ định với tất cả các phần tử bằng một giá trị được chỉ định không (ví dụ: ["foo", "foo", "foo", "foo", "foo"])?

Câu trả lời:


144

Bạn có thể sử dụng Collections.nCopies. Lưu ý rằng điều này sao chép tham chiếu đến đối tượng đã cho, không phải bản thân đối tượng. Nếu bạn đang làm việc với các chuỗi, điều đó sẽ không thành vấn đề vì dù sao thì chúng cũng bất biến.

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

20

Đối với một mảng, bạn có thể sử dụng Arrays.fill (Object [] a, Object val)

String[] strArray = new String[10];
Arrays.fill(strArray, "foo");

và nếu bạn cần một danh sách, chỉ cần sử dụng

List<String> asList = Arrays.asList(strArray);

Sau đó, tôi phải sử dụng hai dòng: String [] strArray = new String [5]; Arrays.fill (strArray, "foo") ;. Có một giải pháp một dòng?

Bạn có thể sử dụng Collections.nCopies (5, "foo") như một giải pháp một dòng để lấy danh sách:

List<String> strArray = Collections.nCopies(5, "foo");

hoặc kết hợp nó với toArrayđể có được một mảng.

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

1
Sau đó, tôi phải sử dụng hai dòng: String[] strArray = new String[5]; Arrays.fill(strArray, "foo");. Có một giải pháp một dòng?
laurt

Rất đơn giản: Collections.nCopies (5, "foo") Thkns!
Marcelo Rebouças

4

Phiên bản bạn có thể sử dụng cho mảng nguyên thủy (Java 8):

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

Lưu ý rằng nó trả về double[], không phảiDouble[]

Hoạt động cho IntegerStream, DoubleStream, LongStream


1

Bằng cách sử dụng IntStream, bạn có thể tạo một loạt các số nguyên, ánh xạ chúng đến phần tử bạn muốn và thu thập nó dưới dạng danh sách.

List<String> list = IntStream.rangeClosed(0, 5)
            .mapToObj(i -> "foo")
            .collect(Collectors.toList());

Hoặc, dưới dạng một mảng

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

1

Nếu đối tượng của bạn không phải là bất biến hoặc không trong suốt tham chiếu, bạn có thể sử dụng

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

và thu thập nó vào danh sách

.collect(Collectors.toList())

hoặc để mảng

.toArray(YourClass[]::new)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.