Kotlin:将两个不同的列表合并为一个,并从两个列表中选择数据

时间:2018-12-05 13:26:30

标签: android arraylist kotlin merge

我想合并两个具有不同类型的列表并创建另一个列表,其中包含两个列表中的数据。另外,仅当标识符匹配(例如两个列表中的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循环并有效地进行操作。

3 个答案:

答案 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。)

相关问题