#kotlin #hashmap
#kotlin #hashmap
Вопрос:
Я пытаюсь получить значение определенного ключа.
У меня есть Hasmap<Account, someValue>
. У меня есть уникальный ключ для идентификации каждой учетной записи по идентификатору. Учетная запись — это класс данных, который я определил.
data class Account (var name : String, val OwnerEmail : String, val sharedUsersEmailList : HashMap <String,Boolean>, val ExpenseKeyList : HashMap <String,Boolean>){
constructor(): this("" , "", hashMapOf(),hashMapOf())
m_accountseExpense
— это hashmap.
Я использую следующий код, чтобы получить учетную запись из HashMap:
private fun GetAccountFromList(accountId : String): Account? {
val accountList = m_accountseExpense.keys
accountList.forEach{
if (it.GetAccountId() == accountId){
Log.w("hashcode", it.hashCode().toString())
return it
}
}
return null
}
Эта функция возвращает учетную запись из HashMap.
После того, как я получил учетную запись из функции, я пытаюсь получить значение, но получаю null
.
Я даже пытаюсь запустить этот код, чтобы проверить его:
val accountToShow = GetAccountFromList(m_accountToShowKey)
// in here I'm getting the Account from the hashmap
Log.w("hashcode", accountToShow.hashCode().toString())
val temp = m_accountseExpense.containsKey(accountToShow)
Log.w("hashcode", temp.toString())
после получения учетной записи я проверяю, есть ли она в Hashmap, и получаю false.
хотя я получаю учетную запись, и все значения одинаковы, и
Хэш-код тот же, и я не могу получить значение этой учетной записи.
когда я пытаюсь получить значение m_accountseExpense[accountToShow], я получаю null .
Есть предложения?
Большое вам спасибо
Редактировать :
fun GetAccountId() : String{
return this.name "_" CreateUserId(this.OwnerEmail)
}
fun CreateUserId(email: String) : String
{
val firstDotIndex = email.indexOf(".")
return email.substring(0,firstDotIndex)
}
Комментарии:
1. Как это
Account.GetAccountId()
выглядит?2. Я обновляю код, GetAccountId — это просто строка
3. Вы уверены
m_accountseExpense
, что карта не изменена в другом потоке? Будет ли это работать сm_accountseExpense.entries.find { (key, value) -> key.GetAccountId() == accountId }?.value
?4. Я не думал использовать lambda, спасибо @МихаилНафталь, но я все равно хотел бы понять, что пошло не так. я почти уверен, что поток не изменил его, я смотрю на все значения, и все hascode одинаковы во всех из них. Я использую эту логику в обратном вызове, и я делаю это в MutableLiveData, но я не думаю, что другой поток изменяет значения.