Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Kotlin(Android)中的ArrayList排序摘要_Arrays_Kotlin - Fatal编程技术网

Arrays Kotlin(Android)中的ArrayList排序摘要

Arrays Kotlin(Android)中的ArrayList排序摘要,arrays,kotlin,Arrays,Kotlin,我试图提供ArrayList中项目的摘要(其中顺序很重要)。基本上,我正在制定一个包含两种不同类型活动(培训和评估)的锻炼计划。然后,在添加每个培训/评估后,我将提供该计划的摘要 我的结构大致如下: exercisePlan: [ {TRAINING OBJECT}, {TRAINING OBJECT}, {ASSESSMENT OBJECT}, {TRAINING OBJECT} ] 我想做的是以以下格式总结: 2次培训、1次评估、1次培训,将在文本视图中以片

我试图提供ArrayList中项目的摘要(其中顺序很重要)。基本上,我正在制定一个包含两种不同类型活动(培训和评估)的锻炼计划。然后,在添加每个培训/评估后,我将提供该计划的摘要

我的结构大致如下:

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,我会用这种方法试试。我将对我目前拥有的东西进行评论,以防其他人发现它更有用。