Làm thế nào để khởi tạo một mảng trong Kotlin với các giá trị?


261

Trong Java, một mảng có thể được khởi tạo, chẳng hạn như:

int numbers[] = new int[] {10, 20, 30, 40, 50}

Làm thế nào để khởi tạo mảng của Kotlin trông như thế nào?


Có lẽ chỉ cần nhìn vào các tài liệu: kotlinlang.org/docs/reference/basic-types.html
khlr

6
Các tài liệu phần nào che giấu câu trả lời. Thay vì đưa ra một ví dụ về mã nguồn, họ đề cập đến hàm (không dùng nữa) array()trong một nhận xét bên: Để tạo một mảng, chúng ta có thể sử dụng một mảng hàm thư viện () và truyền các giá trị mục cho nó, sao cho mảng (1, 2, 3 ) tạo một mảng [1, 2, 3].
Lars Blumberg

8
Mặc dù tôi thích Kotlin nhưng tôi đã nói "Tài liệu về Kotlin" không đủ tốt (tôi đã học được nhiều hơn từ các trang web khác ngoài kotlinlang.org).
Hassan Tareq

1
Ngoài ra, đôi khi bạn chỉ muốn một intRange bạn có thể làm: val numbers = 1..5cung cấp phạm vi int từ 1 đến 5.
Sylhare

Câu trả lời:


313
val numbers: IntArray = intArrayOf(10, 20, 30, 40, 50)

Xem Kotlin - Các loại cơ bản để biết chi tiết.

Bạn cũng có thể cung cấp một hàm khởi tạo như một tham số thứ hai:

val numbers = IntArray(5) { 10 * (it + 1) }
// [10, 20, 30, 40, 50]

8
Có nên sử dụng intArrayOfhơn arrayOf? Như vậy IntArraycó lợi thế hơn Array<Int>?
Lars Blumberg

16
@LarsBlumberg IntArray tương đương với int [], Array <Int> giống với Integer []
user2235698

3
Khởi tạo một danh sách rất giống nhau:listOf(10, 20, 30, 40, 50)
Cristan

Khi tôi đang sử dụng hàm intArrayOf (), tôi phải đối mặt Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage. Tôi đang sử dụng jdk1.8.0_241và Intellij IDEA
DạyMeJava

92

Đáng nói rằng khi sử dụng builtines Kotlin (ví dụ intArrayOf(), longArrayOf(), arrayOf(), vv), bạn không thể khởi tạo mảng với giá trị mặc định (hoặc tất cả các giá trị với giá trị mong muốn) cho một kích thước nhất định, thay vào đó bạn cần phải làm initialize qua gọi theo constructor lớp .

// Array of integers of a size of N
val arr = IntArray(N)

// Array of integers of a size of N initialized with a default value of 2
val arr = IntArray(N) { i -> 2 }

9
Đó là giá trị init mặc định thứ hai sử dụng lambda là siêu hữu ích! Cảm ơn
rf43

9
Hình thức khởi tạo thứ hai có thể được viết là: IntArray(N) {i -> 2}và thậm chí (khi khởi tạo với hằng số)IntArray(N) {2}
David Soroko

1
Thay vì i, chúng ta có thể sử dụng "_" var Array = IntArray (N) {_ -> false}
Navas pk

1
Cái đó với lambda chính xác là thứ tôi cần để khởi tạo một mảng với kích thước động và giá trị mặc định không tùy chọn. Cảm ơn!
mithunc

48

Đây là một ví dụ:

fun main(args: Array<String>) {
    val arr = arrayOf(1, 2, 3);
    for (item in arr) {
        println(item);
    }
}

Bạn cũng có thể sử dụng một sân chơi để kiểm tra các tính năng ngôn ngữ.


2
Một nhận xét, để in giá trị của một mảng, chúng ta có thể sử dụng mảng.joinToString ("") thay vì lặp.
an toàn

2
Hoạt động nhưng trông Java được viết bằng Kotlin nhiều hơn so với Kotlin thành ngữ :)
m0skit0

47

Trong Kotlin có một số cách.

var arr = IntArray(size) // construct with only size

Sau đó, chỉ cần giá trị ban đầu từ người dùng hoặc từ bộ sưu tập khác hoặc bất cứ nơi nào bạn muốn.

var arr = IntArray(size){0}  // construct with size and fill array with 0
var arr = IntArray(size){it} // construct with size and fill with its index

Chúng ta cũng có thể tạo mảng với hàm dựng sẵn như-

var arr = intArrayOf(1, 2, 3, 4, 5) // create an array with 5 values

Cách khác

var arr = Array(size){0} // it will create an integer array
var arr = Array<String>(size){"$it"} // this will create array with "0", "1", "2" and so on.

Bạn cũng có thể sử dụng doubleArrayOf()hoặc DoubleArray()bất kỳ loại nguyên thủy nào thay vì Int.


var arr = IntArray(size, { it * 1 } )giống nhưvar arr = IntArray(size){it}
Det

30

Trong Kotlin chúng ta có thể tạo mảng sử dụng arrayOf(), intArrayOf(), charArrayOf(), booleanArrayOf(), longArrayOf()chức năng.

Ví dụ:

var Arr1 = arrayOf(1,10,4,6,15)  
var Arr2 = arrayOf<Int>(1,10,4,6,15)  
var Arr3 = arrayOf<String>("Surat","Mumbai","Rajkot")  
var Arr4 = arrayOf(1,10,4, "Ajay","Prakesh")  
var Arr5: IntArray = intArrayOf(5,10,15,20)  

Vui lòng định dạng lại câu trả lời này để rõ ràng mã là gì và bình luận là gì.

6

Câu hỏi cũ, nhưng nếu bạn muốn sử dụng một phạm vi:

var numbers: IntArray = IntRange(10, 50).step(10).toList().toIntArray()

Mang lại kết quả gần giống như:

var numbers = Array(5, { i -> i*10 + 10 })

kết quả: 10, 20, 30, 40, 50

Tôi nghĩ rằng tùy chọn đầu tiên là dễ đọc hơn một chút. Cả hai đều làm việc.


5

bạn có thể sử dụng phương pháp này

var numbers=Array<Int>(size,init)
var numbers=IntArray(size,init)
var numbers= intArrayOf(1,2,3)

thí dụ

var numbers = Array<Int>(5, { i -> 0 })

init đại diện cho giá trị mặc định (khởi tạo)


1
Nó giúp nếu bạn đưa ra ví dụ cho inittrong Array<Int>()IntArray(), câu trả lời là không có nhiều hữu ích như của bây giờ.
Lars Blumberg

Câu trả lời đã được sửa đổi
Ali hasan

Mảng <Int> cung cấp cho bạn một mảng các số nguyên được đóng hộp, trong khi IntArray cung cấp cho bạn một mảng int thực tế.
Mike

4

Ngôn ngữ Kotlin chuyên lớp dành cho đại diện các mảng của các kiểu dữ liệu mà không cần đấm bốc trên cao: ví dụ - IntArray, ShortArray, ByteArray, vv Tôi cần phải nói rằng các lớp này không có mối quan hệ thừa kế cho phụ huynh Arraylớp, nhưng họ có cùng một tập hợp các phương pháp và tài sản. Mỗi người trong số họ cũng có một chức năng nhà máy tương ứng. Vì vậy, để khởi tạo một mảng với các giá trị trong Kotlin, bạn chỉ cần gõ này:

val myArr: IntArray = intArrayOf(10, 20, 30, 40, 50)

... Hoặc theo cách này:

val myArr = Array<Int>(5, { i -> ((i+1) * 10) })

myArr.forEach { println(it) }                                // 10, 20, 30, 40, 50

Bây giờ bạn có thể sử dụng nó:

myArr[0] = (myArr[1] + myArr[2]) - myArr[3]

Hi vọng điêu nay co ich.


3

Tôi nghĩ một điều đáng nói và không đủ trực quan từ tài liệu đó là, khi bạn sử dụng hàm xuất xưởng để tạo một mảng và bạn chỉ định kích thước của nó, mảng được khởi tạo với các giá trị bằng với giá trị chỉ mục của chúng. Ví dụ: trong một mảng như thế này : val array = Array(5, { i -> i }), các giá trị ban đầu được gán là [0,1,2,3,4]và không nói , [0,0,0,0,0]. Đó là lý do tại sao từ tài liệu, val asc = Array(5, { i -> (i * i).toString() })tạo ra một câu trả lời của["0", "1", "4", "9", "16"]


3

Bạn có thể tạo một Int Array như thế này:

val numbers = IntArray(5, { 10 * (it + 1) })

5 là kích thước Int Array. Hàm lambda là hàm init phần tử. 'phạm vi' trong [0,4], cộng với 1 phạm vi trong [1,5]

hàm gốc là:

 /**
 * An array of ints. When targeting the JVM, instances of this class are 
 * represented as `int[]`.
 * @constructor Creates a new array of the specified [size], with all elements 
 *  initialized to zero.
 */
 public class IntArray(size: Int) {
       /**
        * Creates a new array of the specified [size], where each element is 
        * calculated by calling the specified
        * [init] function. The [init] function returns an array element given 
        * its index.
        */
      public inline constructor(size: Int, init: (Int) -> Int)
  ...
 }

Lớp IntArray được định nghĩa trong Arrays.kt


2

Bạn có thể thử điều này:

var a = Array<Int>(5){0}

2

Bạn chỉ có thể sử dụng các phương thức thư viện tiêu chuẩn hiện có như được hiển thị ở đây:

val numbers = intArrayOf(10, 20, 30, 40, 50)

Có thể có ý nghĩa khi sử dụng một hàm tạo đặc biệt:

val numbers2 = IntArray(5) { (it + 1) * 10 }

Bạn vượt qua một kích thước và lambda mô tả cách khởi tạo các giá trị. Đây là tài liệu:

/**
 * Creates a new array of the specified [size], where each element is calculated by calling the specified
 * [init] function. The [init] function returns an array element given its index.
 */
public inline constructor(size: Int, init: (Int) -> Int)

2

Tôi tự hỏi tại sao không ai chỉ đưa ra câu trả lời đơn giản nhất:

val array: Array<Int> = [1, 2, 3]

Theo một trong những nhận xét cho câu trả lời ban đầu của tôi, tôi nhận ra điều này chỉ hoạt động khi được sử dụng trong các đối số chú thích (điều này thực sự bất ngờ đối với tôi).

Có vẻ như Kotlin không cho phép tạo ra các mảng chữ bên ngoài các chú thích.

Chẳng hạn, hãy xem mã này bằng cách sử dụng @Option từ thư viện args4j:

    @Lựa chọn(
        tên = "-h",
        bí danh = ["- trợ giúp", "-?"],
        cách sử dụng = "Hiển thị trợ giúp này"
    )
    trợ giúp var: Boolean = false

Đối số tùy chọn "bí danh" có kiểu Array<String>


2
Tôi đã gặp lỗi sau với mã này: Không được hỗ trợ [Bộ sưu tập chữ bên ngoài chú thích]
Rémi P

Tôi chưa từng thấy điều này trước đây. Cú pháp này có mới đối với Kotlin không?
Lars Blumberg

@LarsBlumberg, có lẽ, tôi mới bắt đầu sử dụng Kotlin gần đây với IntelliJ 2019.1 và tôi đã khởi tạo một chuỗi chuỗi giống như tôi đã trình bày và nó hoạt động
hdkrus

@ RémiP, Điểm tốt, tôi đã sử dụng nó trên các đối số chú thích. Nhưng điều đó có nghĩa là các mảng chữ hoạt động trong một số ngữ cảnh và trong một số khác thì không?
hdkrus

1
@hdkrus Tại sao bạn không cập nhật câu trả lời của mình để hiển thị cách khởi tạo mảng hoạt động với chú thích? Điều này có thể có giá trị cho nhiều độc giả của câu hỏi này.
Lars Blumberg

1

Trong trường hợp của tôi, tôi cần khởi tạo các mục ngăn kéo của mình. Tôi điền dữ liệu bằng mã dưới đây.

    val iconsArr : IntArray = resources.getIntArray(R.array.navigation_drawer_items_icon)
    val names : Array<String> = resources.getStringArray(R.array.navigation_drawer_items_name)


    // Use lambda function to add data in my custom model class i.e. DrawerItem
    val drawerItems = Array<DrawerItem>(iconsArr.size, init = 
                         { index -> DrawerItem(iconsArr[index], names[index])})
    Log.d(LOGGER_TAG, "Number of items in drawer is: "+ drawerItems.size)

Lớp mô hình tùy chỉnh-

class DrawerItem(var icon: Int, var name: String) {

}

Điều này không thực sự trả lời câu hỏi một cách hợp lý.
Qwerp-Derp

Vui lòng kiểm tra bình luận trong đó tôi đã sử dụng chức năng lambda để thêm các mục.
Raul

Đây vẫn có vẻ là một cách phức tạp để giải quyết vấn đề này, ít nhất là so với các câu trả lời khác. Ngoài ra tôi đã xem tin nhắn trước đó của tôi và nó có vẻ khắc nghiệt khi nhìn lại - tôi xin lỗi.
Qwerp-Derp

Điều đó là tốt, không có vấn đề. Tôi chỉ cố gắng trả lời theo cách giải quyết vấn đề của mình, tôi không so sánh với các câu trả lời khác. Cảm ơn bạn!
Raul

1

Khai báo mảng int trên toàn cầu

var numbers= intArrayOf()

phương thức onCreate tiếp theo khởi tạo mảng của bạn với giá trị

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    //create your int array here
    numbers= intArrayOf(10,20,30,40,50)
}

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó.
rollstuhlfahrer

1

Trong Java, một mảng có thể được khởi tạo, chẳng hạn như:

int numbers[] = new int[] {10, 20, 30, 40, 50}

Nhưng trong Kotlin, một mảng được khởi tạo theo nhiều cách như:

Bất kỳ loại mảng chung nào bạn có thể sử dụng hàm ArrayOf () :

val arr = arrayOf(10, 20, 30, 40, 50)

val genericArray = arrayOf(10, "Stack", 30.00, 40, "Fifty")

Sử dụng các chức năng tiện ích của Kotlin, một mảng có thể được khởi tạo

val intArray = intArrayOf(10, 20, 30, 40, 50)

1

Cách đơn giản:

Đối với số nguyên:

số var = mảngOf <Int> (10, 20, 30, 40, 50)

Giữ tất cả các loại dữ liệu

số var = mảngOf (10, "giá trị chuỗi", 10,5)


0

intialize mảng theo cách này: val paramValueList : Array<String?> = arrayOfNulls<String>(5)


0

Theo cách này, bạn có thể khởi tạo mảng int trong koltin.

 val values: IntArray = intArrayOf(1, 2, 3, 4, 5,6,7)

Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
leopal

0

Câu trả lời của tôi bổ sung cho @maroun đây là một số cách để khởi tạo một mảng:

Sử dụng một mảng

val numbers = arrayOf(1,2,3,4,5)

Sử dụng một mảng nghiêm ngặt

val numbers = intArrayOf(1,2,3,4,5)

Trộn các loại ma trận

val numbers = arrayOf(1,2,3.0,4f)

Mảng lồng

val numbersInitials = intArrayOf(1,2,3,4,5)
val numbers = arrayOf(numbersInitials, arrayOf(6,7,8,9,10))

Khả năng bắt đầu với mã động

val numbers = Array(5){ it*2}
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.