return for 循环中函数的新列表以传入更新列表

return a new list from function in a for loop to pass in the updated list

我有一个方法将一个列表作为参数,对它执行一些操作,returns 新列表。但是,在我的 for..loop 中,我会继续传递更新的列表,直到 for..loop 完成。

有办法吗?

fun main(args: Array<String>) {    
    val listOfSeatRows = (1..127).toList()
    
    // Just loop until all the listOfPass has completed.
    listOfPass.forEach { seatPass ->
        val seat = Seat.valueOf(seatPass.toString())
        // I want to pass in the new updated list not the same list 
        getListOfSeatRows(listOfSeatRows, seat)
    }
}

此方法采用列表和 return 更新后的列表。但是,在上面的 for..loop 中,我想传入从这个方法 return 编辑的列表

private fun getListOfSeatRows(listOfSeat: List<Int>, seatPosition: Seat): List<Int> {
    return when(seatPosition) {
        Seat.F, Seat.L -> {
           listOfSeat.windowed(listOfSeat.count() / 2).first()
        }
        Seat.B, Seat.R -> {
            listOfSeat.windowed(listOfSeat.count() / 2).last()
        }
    }
}

enum class Seat(seat: Char) {
    F('F'),
    B('B'),
    L('L'),
    R('R')
}

递归 也许这将有助于根据您的代码进行一些增强:

var ss = 1
val listOfPass = listOf<Char>('F', 'L','B','R')

fun main(args: Array<String>) {
    val listOfSeatRows = (1..127).toList()
    val answer = getListOfSeatRows(
        listOfSeatRows,
        listOfSeatRows.count() / 2,
        Seat.valueOf(listOfPass[0].toString())
    )
    println(answer)
}

private fun getListOfSeatRows(listOfSeat: List<Int>, count: Int, seatPosition: Seat): List<Int> {
    val tempList: List<Int> = when (seatPosition) {
        Seat.F, Seat.L -> {
            listOfSeat.windowed(count).first()
        }
        Seat.B, Seat.R -> {
            listOfSeat.windowed(count).last()
        }
        else -> listOfSeat
    }
if(count == 0 || count == 1) return listOfSeat

    if (listOfPass.size > ss) {
        val seat = Seat.valueOf(listOfPass[ss++].toString())
        return getListOfSeatRows(tempList, count / 2, seat)
    }

    return listOfSeat
}

要么改变变量:

fun main(args: Array<String>) {    
    var listOfSeatRows = (1..127).toList()
    
    // Just loop until all the listOfPass has completed.
    listOfPass.forEach { seatPass ->
        val seat = Seat.valueOf(seatPass.toString())
        // I want to pass in the new updated list not the same list 
        listOfSeatRows = getListOfSeatRows(listOfSeatRows, seat)
    }
}

或者您改变列表:

fun main(args: Array<String>) {    
    var listOfSeatRows = (1..127).toMutableList()
    
    // Just loop until all the listOfPass has completed.
    listOfPass.forEach { seatPass ->
        val seat = Seat.valueOf(seatPass.toString())
        // I want to pass in the new updated list not the same list 
        reduceListOfSeatRows(listOfSeatRows, seat)
    }
}

private fun reduceListOfSeatRows(listOfSeat: MutableList<Int>, seatPosition: Seat) {
    val half = listOfSeat.size / 2
    when(seatPosition) {
        Seat.F, Seat.L -> {
            while (listOfSeat.size > half) listOfSeat.removeLast()
        }
        Seat.B, Seat.R -> {
            while (listOfSeat.size > half) listOfSeat.removeFirst()
        }
    }
}

如果您坚持改变 属性,您的函数可以使用 take/takeLast:

来简化(并避免浪费创建多个中间列表)
private fun getListOfSeatRows(listOfSeat: List<Int>, seatPosition: Seat): List<Int> {
    return when(seatPosition) {
        Seat.F, Seat.L -> {
            listOfSeat.take(listOfSeat.size / 2)
        }
        Seat.B, Seat.R -> {
            listOfSeat.takeLast(listOfSeat.size / 2)
        }
    }
}