Cách khởi tạo tất cả các phần tử của mảng thành bất kỳ giá trị cụ thể nào trong java


108

Trong C/C++chúng ta có memset()hàm có thể đáp ứng mong muốn của tôi nhưng Javalàm cách nào để tôi có thể khởi tạo tất cả các phần tử thành một giá trị cụ thể? Bất cứ khi nào chúng ta viết int[] array=new int[10];, điều này chỉ cần khởi tạo một mảng có kích thước 10 có tất cả các phần tử bằng 0. Tôi chỉ muốn thay đổi số nguyên khởi tạo này cho một trong các mảng của tôi. tức là tôi muốn khởi tạo một mảng có tất cả các phần tử bằng -1. Nếu không, tôi phải đặt một forvòng lặp ngay sau khi khởi tạo, phạm vi từ chỉ mục 0đến chỉ mục size-1và bên trong vòng lặp đó, tôi đang gán phần tử cho -1. Dưới đây là mã để hiểu thêm-

    int[] array = new int[10];
    for (int i = 0; i < size; i++) {
        array[i] = -1;
    }

Tôi đi đúng không? Có cách nào khác cho tương tự không?

Câu trả lời:


212

Nếu đó là kiểu nguyên thủy, bạn có thể sử dụng Arrays.fill():

Arrays.fill(array, -1);

[ Ngẫu nhiên, memsettrong C hoặc C ++ chỉ được sử dụng thực sự cho các mảng char. ]


17
Tôi đã kiểm tra mã nguồn của Arrays.fill(). Nó làm điều tương tự. public static void fill(int[] a, int val) { for (int i = 0, len = a.length; i < len; i++) a[i] = val; }
Ravi Joshi

2
Vâng. Như nó phải được. Mặc dù tôi nghi ngờ rằng JIT có thể đủ thông minh để cải thiện việc triển khai cơ bản.
Louis Wasserman

1
Tôi không đồng ý. memsetcũng có thể được sử dụng, và trên thực tế là rất hữu ích, trong mảng số nguyên khi bạn cần điền 0hoặc -1, ví dụ trong các bài toán DP.
Sнаđошƒаӽ

@ Sнаđошƒаӽ - Không phải theo cách xách tay.
Oliver Charlesworth

1
Chỉ là FYI: Bạn có thể sử dụng memset_pattern4, 8 & 16 cho các kích thước số nguyên khác.
geowar

32

Ngoài ra còn có

int[] array = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};

12
Điều gì xảy ra nếu kích thước của mảng không xác định?
Abhishek kumar

5

Nó cũng có thể với các luồng Java 8:

int[] a = IntStream.generate(() -> value).limit(count).toArray();

Tuy nhiên, có lẽ không phải là cách hiệu quả nhất để thực hiện công việc.


Điều này cũng sẽ hoạt động đối với các kiểu không nguyên thủy ( Stream.generate(() -> new Whatever("Hello World", 42)).limit(count).toArray();), do đó linh hoạt hơn Arrays.fill (). Tuy nhiên, không chắc chắn về hiệu quả, như bạn nói.
Christopher Riches

3

Bạn có thể làm điều này nếu nó ngắn:

int[] array = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};

nhưng điều đó trở nên tồi tệ đối với nhiều hơn một số người.

Dễ dàng hơn sẽ là một forvòng lặp:

  int[] myArray = new int[10];
  for (int i = 0; i < array.length; i++)
       myArray[i] = -1;

Chỉnh sửa: Tôi cũng thích Arrays.fill()tùy chọn mà người khác đã đề cập.


có quy định nào để khởi tạo mảng 2 chiều không? một cái gì đó giống như int a [] [] = new int [3] [4]; Arrays.fill (a, -1); sao cho tất cả 12 phần tử sẽ được đặt bằng -1.
PoornaChandra



0

Bạn có thể sử dụng Arrays.fill(array, -1).


0

Rõ ràng là bạn có thể sử dụng Arrays.fill (), mặc dù vậy, cách bạn thực hiện cũng hoạt động.


Ya. Thậm chí Arrays.fill()sử dụng một forvòng lặp với chỉ mục 0để size-1. Cùng một cách, những gì tôi đã làm. Cảm ơn bạn vì câu trả lời.
Ravi Joshi

0

Sử dụng Java 8, bạn chỉ có thể sử dụng ncopiescác Collectionslớp:

Object[] arrays = Collections.nCopies(size, object).stream().toArray();

Trong trường hợp của bạn, nó sẽ là:

Integer[] arrays = Collections.nCopies(10, Integer.valueOf(1)).stream().toArray(Integer[]::new);
.

Đây là câu trả lời chi tiết về một trường hợp tương tự của bạn.


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.