2016-05-26 19 views
14

Mã bên dưới tạo bản đồ mới có tên nameTable, sau đó thêm mục nhập có tên là ví dụ, sau đó cố gắng in thuộc tính tên của Giá trị.Cách làm việc với Bản đồ trong Kotlin

Khi tôi chạy, có vẻ như thao tác cộng không thêm mục nhập mới vào bản đồ như tôi nghĩ.

Vì vậy, tôi đang làm gì sai?

class Person(name1: String, lastName1: String, age1: Int){ 
    var name: String = name1 
    var lastName: String = lastName1 
    var age: Int = age1 
} 

var nameTable: MutableMap<String, Person> = mutableMapOf() 
var example = Person("Josh", "Cohen", 24) 

fun main (args: Array<String>){ 
    nameTable.plus(Pair("person1", example)) 
    for(entry in nameTable){ 
     println(entry.value.age) 
    } 
} 

Khi chúng tôi ở đó, tôi rất thích một số ví dụ về cách thêm, xóa và lấy mục nhập từ bản đồ.

Trả lời

5

Phương pháp cộng trên Map tạo bản đồ mới chứa mục nhập mới. Nó không làm thay đổi bản đồ gốc. Nếu bạn muốn sử dụng phương pháp này, bạn sẽ cần phải làm điều này:

fun main (args: Array<String>){ 
    val table = nameTable.plus(Pair("person1", example)) 
    for (entry in table) { 
     println(entry.value.age) 
    } 
} 

Nếu bạn muốn thêm các mục nhập vào bản đồ ban đầu, bạn cần phải sử dụng các phương pháp put như trong Java.

này sẽ làm việc:

fun main (args: Array<String>){ 
    nameTable.put("person1", example) 
    for (entry in nameTable) { 
     println(entry.value.age) 
    } 
} 

Để có được và loại bỏ đi từ MutableMap, bạn có thể sử dụng này:

nameTable["person1"] // Syntactic sugar for nameTable.get("person1") 
nameTable.remove("person1") 
+0

Bằng cách này, có ai biết lý do tại sao không có một 'hành vui vẻ trừ (chìa khóa: K) 'phương pháp trên bản đồ Kotlin? – marstran

21

Lý do cho sự nhầm lẫn của bạn được rằng pluskhông một mutating toán tử, nghĩa là nó hoạt động trên (chỉ đọc) Map, nhưng không thay đổi bản thân cá thể. Đây là chữ ký:

operator fun <K, V> Map<out K, V>.plus(pair: Pair<K, V>): Map<K, V> 

gì bạn muốn là một nhà điều hành mutating set, xác định trên MutableMap:

operator fun <K, V> MutableMap<K, V>.set(key: K, value: V) 

Vì vậy, mã của bạn có thể được viết lại (với một số cải tiến bổ sung):

class Person(var name: String, var lastName: String, var age: Int) 

val nameTable = mutableMapOf<String, Person>() 
val example = Person("Josh", "Cohen", 24) 

fun main (args: Array<String>) { 
    nameTable["person1"] = example 

    for((key, value) in nameTable){ 
     println(value.age) 
    } 
} 
+0

'+ =' cũng sẽ hoạt động. –

1

Bạn phải sử dụng

đặt

phương pháp.

class Person(name1:String, lastName1:String, age1:Int){ 
    var name:String = name1 
    var lastName:String = lastName1 
    var age:Int = age1 
} 
var nameTable:MutableMap<String, Person> = mutableMapOf() 
var example = Person("Josh", "Cohen", 24) 
fun main (args: Array<String>){ 
    nameTable.put("person1", example) 
    for(entry in nameTable){ 
     println(entry.value.age) 
    } 
} 
1

Nó quá nhiều rắc rối, Bạn có thể gán giá trị trực tiếp, như thế này:

@Test 
@Throws(Exception::class) 
fun main(){ 

    val map:MutableMap<String,Person> = mutableMapOf() 

    map["Josh"]= Person("Josh", "Cohen", 24) 

    map.forEach { t, u -> 
     println("map key:$t,map value:${u.toString()}") 
    } 
} 

class Person(name1:String, lastName1:String, age1:Int){ 
    var name:String = name1 
    var lastName:String = lastName1 
    var age:Int = age1 

    override fun toString(): String { 
     return "name:$name,lastNam:$lastName,age:$age \n" 
    } 
} 
Các vấn đề liên quan