Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
List Kotlin从列表中获取x元素,但首先删除最小的数字_List_Sorting_Kotlin - Fatal编程技术网

List Kotlin从列表中获取x元素,但首先删除最小的数字

List Kotlin从列表中获取x元素,但首先删除最小的数字,list,sorting,kotlin,List,Sorting,Kotlin,假设你有一个类产品。在这个类中,有一个mutablelistOf()。类库存包含两个属性:一个属性是库存的数量,另一个属性是星的数量。mutabeListOf()按星数升序排序(列表中的第一只股票有一颗星,然后是两颗星,然后是三颗星…) 现在有一个客户希望从产品列表中删除5项(客户减少quantity属性)。客户应从库存中取出物品,首先最少的星数。 如上所述,星星数量最少的股票位于列表的开头。客户获取这5个项目后,库存对象的quantity属性应减少,并且当该对象的quantity属性为0时,应

假设你有一个类
产品
。在这个类中,有一个
mutablelistOf()
。类
库存
包含两个属性:一个属性是库存的
数量
,另一个属性是
星的数量
mutabeListOf()
星数升序排序(列表中的第一只股票有一颗星,然后是两颗星,然后是三颗星…)

现在有一个客户希望从产品列表中删除5项(客户减少quantity属性)。客户应从
库存
中取出物品,首先最少的星数。
如上所述,星星数量最少的股票位于列表的开头。客户获取这5个项目后,库存对象的quantity属性应减少,并且当该对象的quantity属性为0时,应将其从列表中删除

另一种情况是没有足够的物品可供携带(例如,客户想要15件物品,但总共有10件)。在这种情况下,应取最大金额(10),并退回客户取的金额(例如,此处为10)

我知道如何删除这些项目,但当我删除它们时,数量会低于0,for循环不会“跳转”到下一个Stockobject

这是我目前的方法:类股票

class Stock(var quantity: Int, val stars: Int) {
    init {
        if (quantity < 0) quantity = 0
    }
}
类别库存(变量数量:Int,变量星:Int){
初始化{
如果(数量<0)数量=0
}
}
类产品和功能项:

class Product {
    private val stockList = mutableListOf<Stock>()
    val availableItems: Double
        get() {
            return stockList.map { it.quantity.toDouble() }.sum()
        }

    fun addStock(item: Stock) = stockList.add(item)
    fun enoughItemsAvailable(itemQuantity: Int): Boolean = availableItems >= itemQuantity

    // The function I am trying to create to take items out of the list
    fun takeItems(quantity: Int): Int {
        stockList.sortBy { it.stars }

        var taken = 0
        for (i in stockList.indices) {
            if (stockList[i].quantity == 0) stockList.removeAt(i)
            if (enoughItemsAvailable(quantity)) {
                do {
                    stockList[i].quantity -= quantity
                    taken++
                } while (stockList[i].quantity > 0 || taken != quantity)
            } else {
                // when there is not enough items to be taken
                stockList.clear()
                return quantity
            }
        }
        return taken
    }
类产品{
private val stockList=mutableListOf()
val可用项:双倍
得到(){
return stockList.map{it.quantity.toDouble()}.sum()
}
乐趣添加库存(项目:库存)=库存列表。添加(项目)
fun-enoughItemsAvailable(itemQuantity:Int):布尔=可用Items>=itemQuantity
//我试图创建的用于从列表中删除项目的函数
娱乐项目(数量:整数):整数{
stockList.sortBy{it.stars}
var=0
对于(股票清单指数中的i){
如果(库存清单[i]。数量==0)库存清单.removeAt(i)
如果(足够项目可用(数量)){
做{
存货清单[i]。数量-=数量
采取++
}while(库存清单[i]。数量>0 | |取数!=数量)
}否则{
//当没有足够的物品时
股票清单
退货数量
}
}
回执
}

我希望你们能理解我的问题。我感谢你们的帮助!

在你们的代码中,你们从列表中的第一批库存中获取了所需的全部数量,即使这会导致其数量为负数。我认为你们应该将
stockList[I]。数量--
而不是
stockList[I].quantity-=数量
,因为您的策略似乎是一次删除一个

此外,如果循环中的第一行是空的,则将其移除,然后下一部分开始从下一个库存中移除,而无需首先检查其是否为空。如果一行中有两个库存为空,该怎么办?因此,第一个
if
应该是
while

但是,由于您在迭代索引时从列表中删除,因此如果删除了任何项目,您将出现
索引自动边界异常
。因此,如果(i>=stockList.size)break
,您需要在循环的开始处添加

您的检查是否有足够的项目来满足完整请求,可以将其移到循环之外,以避免重复检查该条件

我认为一个更简单的策略是遍历列表,从每个
库存中取尽你所需的量,直到你已经取够或用尽了列表。然后用一行删除列表中的空库存。这样,你就不需要单独的逻辑分支来处理没有足够的库存来满足请求的情况,而且你也不需要不需要单独检查是否有库存已空

fun takeItems(quantity: Int): Int {
    stockList.sortBy { it.stars }

    var taken = 0
    for (stock in stockList) {
        val toRemove = min(quantity - taken, stock.quantity)
        taken += toRemove
        stock.quantity -= toRemove
        if (quantity == taken) break
    }

    stockList.removeAll { it.quantity == 0 }

    return taken
}
顺便说一句,它看起来像是
availableItems
应该是
Int
,而不是
Double
,因为它是一个项目计数。使用

    val availableItems: Int
        get() = stockList.sumBy(Stock::quantity)

因为每次访问此属性时,使用
map
都会创建一个新列表。

非常感谢,它的工作原理与应该的完全相同。但我不知道为什么。此
min(已获取的数量,库存.数量)
是如何工作的,有没有办法不用
min()解决我的问题
?您能稍微解释一下您的函数吗,这样我就知道它是如何工作的了?谢谢
min
返回两个值中较小的一个。您可以从每只股票中删除所有股票的数量,或者删除剩余的数量,以满足
数量
,以较小的为准。解决此问题的方法有很多.如果你应用我的更正,你没有
min
的方法应该有效。