Arrays Kotlin(Android)中的ArrayList排序摘要
我试图提供ArrayList中项目的摘要(其中顺序很重要)。基本上,我正在制定一个包含两种不同类型活动(培训和评估)的锻炼计划。然后,在添加每个培训/评估后,我将提供该计划的摘要 我的结构大致如下:Arrays Kotlin(Android)中的ArrayList排序摘要,arrays,kotlin,Arrays,Kotlin,我试图提供ArrayList中项目的摘要(其中顺序很重要)。基本上,我正在制定一个包含两种不同类型活动(培训和评估)的锻炼计划。然后,在添加每个培训/评估后,我将提供该计划的摘要 我的结构大致如下: exercisePlan: [ {TRAINING OBJECT}, {TRAINING OBJECT}, {ASSESSMENT OBJECT}, {TRAINING OBJECT} ] 我想做的是以以下格式总结: 2次培训、1次评估、1次培训,将在文本视图中以片
exercisePlan: [
{TRAINING OBJECT},
{TRAINING OBJECT},
{ASSESSMENT OBJECT},
{TRAINING OBJECT}
]
我想做的是以以下格式总结:
2次培训、1次评估、1次培训
,将在文本视图中以片段形式显示。因此,我将有一个任意长的字符串,详细说明练习计划的结构和顺序。我曾尝试使用HashMap或普通ArrayList进行研究,但它看起来相当混乱,所以我正在寻找一种更干净的方法(可能是可变列表)。提前谢谢 ArrayList只是一种特定类型的可变列表。通常最好使用一个简单的列表,因为易变性会使代码更加复杂,并保持健壮 我将创建一个类的列表,其中包含一个动作和连续完成该动作的次数
enum class Activity {
Training, Assessment
}
data class SummaryPlanStep(val activity: Activity, val consecutiveTimes: Int) {
override fun toString() = "$consecutiveTimes x $activity"
}
如果要从摘要开始,可以创建它,然后将其转换为一个简单的活动列表,如下所示:
val summary: List<SummaryPlanStep> = listOf(
SummaryPlanStep(Activity.Training, 2),
SummaryPlanStep(Activity.Assessment, 1),
SummaryPlanStep(Activity.Training, 1),
)
val plan: List<Activity> = summary.flatMap { List(it.consecutiveTimes) { _ -> it.activity } }
val摘要:List=listOf(
总结计划步骤(活动培训,2),
总结计划步骤(活动评估,1),
总结计划步骤(活动培训,1),
)
val计划:List=summary.flatMap{List(it.consutivetimes){{{uu->it.activity}
如果你想用另一种方法来做,那就更复杂了,因为我不认为有一种内置的方法可以对连续的重复元素进行分组。您可以为此编写一个函数
fun <T> List<T>.groupConsecutiveDuplicates(): List<Pair<T, Int>> {
if (isEmpty()) return emptyList()
val outList = mutableListOf<Pair<T, Int>>()
var current = first() to 1
for (i in 1 until size) {
val item = this[i]
current = if (item == current.first)
current.first to (current.second + 1)
else {
outList.add(current)
item to 1
}
}
outList.add(current)
return outList
}
val plan: List<Activity> = listOf(
Activity.Training,
Activity.Training,
Activity.Assessment,
Activity.Training
)
val summary: List<SummaryPlanStep> = plan.groupConsecutiveDuplicates().map { SummaryPlanStep(it.first, it.second) }
fun List.groupConcertiveDuplicates():List{
if(isEmpty())返回emptyList()
val outList=mutableListOf()
var current=first()到1
适用于(i/1,直到尺寸){
val项目=此[i]
当前=如果(项目==当前。第一个)
当前第一到(当前第二+1)
否则{
大纲视图。添加(当前)
项目至1
}
}
大纲视图。添加(当前)
返回时间最长
}
val计划:列表=列表(
活动,培训,,
活动,培训,,
活动.评估,
活动、培训
)
val summary:List=plan.groupconsuitedUpplicates().map{SummaryPlanStep(it.first,it.second)}
这就是我目前为自己工作所做的准备:
if (exercisePlanSummary.isNotEmpty() && exercisePlanSummary[exercisePlanSummary.size - 1].containsKey(trainingAssessment)) {
exercisePlanSummary[exercisePlanSummary.size - 1][trainingAssessment] = exercisePlanSummary[exercisePlanSummary.size - 1][trainingAssessment]!! + 1
} else {
exercisePlanSummary.add(hashMapOf(trainingAssessment to 1))
}
var textToDisplay = ""
exercisePlanSummary.forEach {
textToDisplay = if (textToDisplay.isNotEmpty()) {
textToDisplay.plus(", ${it.values.toList()[0]} x ${it.keys.toList()[0].capitalize()}")
} else {
textToDisplay.plus("${it.values.toList()[0]} x ${it.keys.toList()[0].capitalize()}")
}
}
其中trainingAssessment
是的字符串“training”
或的“assessment”
<代码>练习计划摘要
是一个数组列表
上面@Tenfour04所写的内容可能更合适,而且是一种更干净的实现方式。但是我的方法很简单。谢谢@Tenfour04,我会用这种方法试试。我将对我目前拥有的东西进行评论,以防其他人发现它更有用。