Java 更改特定键的值也会更改其他键的值

Java 更改特定键的值也会更改其他键的值,java,kotlin,arraylist,key-value,Java,Kotlin,Arraylist,Key Value,这就是我生成dutyList的方法 val dutyList = ArrayList<Triple<Int, String, ArrayList<Pair<String, String>>>>() val dateShiftPair = ArrayList<Pair<String, String>>() dateList.forEach {date -> dateShiftPair.add(Pair(da

这就是我生成dutyList的方法

val dutyList = ArrayList<Triple<Int, String, ArrayList<Pair<String, String>>>>()

val dateShiftPair = ArrayList<Pair<String, String>>()

dateList.forEach {date ->
     dateShiftPair.add(Pair(date, "E"))
}


staffList.forEach {staff -> 
     dutyList.add(Triple(list.indexOf(staff), staff.name!!, dateShiftPair))
}
但是相反,它会更改pos中的其他值,也就是说,如果我更改statflistupdated[0]。第三[0]=pair它会更改statflistupdated[1]。第三[0]=pair。我试了很多方法,但都没用

[
  {
    "first": 0,
    "second": "Ralph",
    "third": [
      {
        "first": "3/5",
        "second": "G" //change should happen here only
      },
      {
        "first": "4/5",
        "second": "E"
      },
      {
        "first": "6/5",
        "second": "E"
      }
    ]
  },
  {
    "first": 1,
    "second": "Mike",
    "third": [
      {
        "first": "3/5",
        "second": "G" //but change happens here as well.
      },
      {
        "first": "4/5",
        "second": "E"
      },
      {
        "first": "5/5",
        "second": "E"
      }
    ]
  }
]

每个
三元组都使用相同的列表实例

这意味着,如果您获得一个
三元组的列表并更改某些内容,则每更改一个
三元组

解决方案是在插入或修改时复制列表


您还需要对列表进行深度复制。因为如果你对列表做了一个浅拷贝,
对的实例仍然是相同的,如果你改变了其中一个实例,你会(再次)为每一个
三元组改变它,这不可能编译,因为当在列表上调用indexof时,Pair的equals方法不会比较其中的键,但是无论如何,为什么不使用一个映射(hashmap)而不是一个有对的列表呢?HashMaps更快,而且可以轻松地使用containsKey()来找出密钥存在。对于所有三元组,您的代码使用与第三个值相同的列表实例。深度复制解决了这个问题。
[
  {
    "first": 0,
    "second": "Ralph",
    "third": [
      {
        "first": "3/5",
        "second": "G" //change should happen here only
      },
      {
        "first": "4/5",
        "second": "E"
      },
      {
        "first": "6/5",
        "second": "E"
      }
    ]
  },
  {
    "first": 1,
    "second": "Mike",
    "third": [
      {
        "first": "3/5",
        "second": "G" //but change happens here as well.
      },
      {
        "first": "4/5",
        "second": "E"
      },
      {
        "first": "5/5",
        "second": "E"
      }
    ]
  }
]
staffList.forEach {staff -> 
     dutyList.add(Triple(list.indexOf(staff), staff.name!!, dateShiftPair))
}