我想合并两个具有不同类型的列表并创建另一个列表,其中包含两个列表中的数据。另外,仅当标识符匹配(例如两个列表中的ID都匹配)时才发生合并
import axios from 'axios';
因此,有Employee(val employeeId: Int,
val employeeName: String,
val address: String)
LaptopInfo(val laptopId: Int,
val employeeId: String,
val team: String)
EmployeeLaptopInfo(val laptopId: Int,
val employeeId: String,
val employeeName: String,
val address: String)
和Employee
的列表,我只想在两个列表中的employeeId都匹配时才将EmployeeLaptopInfo添加到LaptopInfo
List<EmployeeLaptopInfo>
但是这样一来,我无法从两个列表中获取详细信息。没有任何方法可以不使用for循环并有效地进行操作。
答案 0 :(得分:1)
我已经优化了 Yoni Gibbs的解决方案。这个想法是filter
employeeId
中存在Employee
的笔记本电脑。然后将每个laptop
转换为EmployeeLaptopInfo
。
data class Employee(val employeeId: Int, val employeeName: String, val address: String)
data class LaptopInfo(val laptopId: Int, val employeeId: Int, val team: String)
data class EmployeeLaptopInfo(val laptopId: Int, val employeeId: Int, val employeeName: String, val address: String)
fun main(args: Array<String>) {
val employees = listOf<Employee>()
val laptops = listOf<LaptopInfo>()
val employeesById: Map<Int, Employee> = employees.associateBy { it.employeeId }
val result = laptops.filter { employeesById[it.employeeId] != null }.map { laptop ->
employeesById[laptop.employeeId]?.let { employee ->
EmployeeLaptopInfo(laptop.laptopId, laptop.employeeId, employee.employeeName, employee.address)
}
}
}
答案 1 :(得分:0)
我认为您的类的某些属性的数据类型有误,所以我这样更改了它们:
class Employee(val employeeId: Int, val employeeName: String, val address: String)
class LaptopInfo(val laptopId: Int, val employeeId: Int, val team: String)
class EmployeeLaptopInfo(val laptopId: Int, val employeeId: Int, val employeeName: String, val address: String)
如果这些是初始列表:
val employeeList = mutableListOf<Employee>()
val laptopInfoList = mutableListOf<LaptopInfo>()
然后通过在两个列表中找到employeeList
的对应值来映射employeeId
:
val employeeLaptopInfoList =
employeeList.mapNotNull { emp ->
val laptop = laptopInfoList.find { it.employeeId == emp.employeeId }
if (laptop == null) null
else EmployeeLaptopInfo(
laptop.laptopId,
emp.employeeId,
emp.employeeName,
emp.address)
}
答案 2 :(得分:0)
我认为最好先创建两个地图,一个用于笔记本电脑,一个用于员工,这两个地图都键入到employeeId上。然后,您可以执行以下操作:
val employees = listOf<Employee>()
val laptops = listOf<LaptopInfo>()
val laptopsByEmployeeId: Map<Int, List<LaptopInfo>> = laptops.groupBy { it.employeeId }
val employeesById: Map<Int, Employee> = employees.associateBy { it.employeeId }
val result = laptopsByEmployeeId.flatMap { (employeeId, laptops) ->
laptops.mapNotNull { laptop ->
employeesById[employeeId]?.let { employee ->
EmployeeLaptopInfo(laptop.laptopId, employeeId, employee.employeeName, employee.address)
}
}
}
这意味着您永远不会在一个列表内循环另一个列表,这可能会导致效率低下。取而代之的是,您使用地图通过其ID快速获取物品。
(此外,根据forpas的回答,我假设employeeId的数据类型在所有类中都应相同,例如Int。)