2013-04-03 54 views
1

我正在將一些java代碼翻譯爲scala,並且我無法從列表中使用刪除對象。我的代碼如下Scala從列表中刪除單個對象

def removeCar (usedCarList: List[UsedCars]):List[UsedCars] ={ 
    //var vinNumber = ""; 
    var car = new UsedCars(); 
    println("Please enter the Vin Number"); 
    var vinNumber = readLine(); 
    var i = 0; 
    var found = false; 
    while (i < usedCarList.length){ 
     car = usedCarList(i); 
     if (vinNumber == car.vinNumber) { 
      usedCarList.drop(i); 
      println("** Removed Car with Vin Number " + vinNumber + " **"); 
      println(car.vinNumber); 
      found = true; 
     } 

我知道滴是不是即時尋找到使用,但我無法弄清楚如何在給定的指數下降的元素。

+0

你不能用不可變的List來做到這一點:你必須使用'scala.collection.mutable'包中的類。 – 2013-04-03 20:50:37

+0

您可能錯誤地認爲scala「List」與java.util.List類似。不幸的是,它們是完全不同的東西。 – ghik 2013-04-03 21:02:56

+0

每次你想破壞它時,你都可以自由創建一個新的不變列表。你可以用List.splitAt()在索引上做,然後去掉分割的頭部或尾部。我會嘗試List.dropWhile(),而不是你當前的循環。如果您需要從謂詞中打印副作用,則可以將其解除。 – n0741337 2013-04-03 21:34:14

回答

1

正如評論中指出的,Scala的List有一個非常不同的方法。您仍然可以使用該類型,因爲它非常簡單且實用,只有您不能使用類似drop之類的內容。在任何情況下,你有變量carfoundwhileif等迭代的類型,還是很java'ish。

嘗試使用Scala收集提供的映射,拆分和過濾功能。

def removeCar (usedCarsList: List[UsedCars]): List[UsedCars] ={ 
    println("Please enter the Vin Number") 
    val vinNumber = readLine() 
    val (same, different) = usedCarsList.partition(_ == vinNumber) 
    if (same.nonEmpty) { 
    println("** Removed Car with Vin Number " + vinNumber + " **") 
    same.map(_.vinNumber).foreach(println) 
    } 
    different 
} 

如果你不關心驗證列表改變了,你也可以只是做一個

val removed = usedCarsList.filterNot(_ == vinNumber) 

我上面使用的方法,partition,是right at the start of the Scala collections introduction.