如何将同标题的MyAdList数据分组为二维数组?
按标题分组MyAdList的正确实现
你的原代码存在两个核心问题:
- 每次添加的都是完整的原MyAdList列表,而非分组后的子元素,最终testData里会全是同一个列表的引用,完全不符合分组需求
- 逻辑错误:仅判断当前元素与前一个元素的标题是否相同,但没有维护正在构建的分组,无法将同标题元素归集到同一个子列表中
方法一:手动循环实现分组
val myAdList = it.responseData.myAdList val testData: ArrayList<ArrayList<AdvertisingResponse.MyAdList>> = ArrayList() if (myAdList.isEmpty()) { // 空列表直接返回,避免后续逻辑报错 return@xxx // 根据实际上下文调整,比如lambda里用return@forEach } // 初始化第一个分组,添加第一个元素 var currentGroup = ArrayList<AdvertisingResponse.MyAdList>() currentGroup.add(myAdList[0]) for (i in 1 until myAdList.size) { val currentItem = myAdList[i] val lastItemInGroup = currentGroup.last() if (currentItem.title == lastItemInGroup.title) { // 标题相同,加入当前分组 currentGroup.add(currentItem) } else { // 标题不同,将当前分组存入结果,新建分组 testData.add(currentGroup) currentGroup = ArrayList() currentGroup.add(currentItem) } } // 别忘了把最后一个分组加入结果 testData.add(currentGroup)
方法二:用Kotlin标准库简化实现
Kotlin的groupBy函数可以直接按指定键分组,再将结果转换为需要的二维ArrayList结构:
val myAdList = it.responseData.myAdList val testData = ArrayList<ArrayList<AdvertisingResponse.MyAdList>>() // 先按title分组,再将每个分组的List转成ArrayList存入结果 myAdList.groupBy { it.title } .values .forEach { group -> testData.add(ArrayList(group)) }
注:如果原列表中同标题的元素是连续的,两种方法结果一致;如果同标题元素不连续,
groupBy会将所有同标题元素归为一组,而手动循环只会将连续的同标题元素分组。根据你的需求选择即可。
内容的提问来源于stack exchange,提问作者Duseop
相关产品推荐
相关产品推荐

