Ich habe eine Liste, die Elemente enthalten kann, die als gleich verglichen werden. Ich hätte gerne eine ähnliche Liste, aber mit einem entfernten Element. Also möchte ich aus (A, B, C, B, D) nur ein B "entfernen" können, um zB (A, C, B, D) zu erhalten. Die Reihenfolge der Elemente im Ergebnis spielt keine Rolle.
Ich habe Arbeitscode, der in Scala von Lisp inspiriert ist. Gibt es einen idiomatischeren Weg, dies zu tun?
Der Kontext ist ein Kartenspiel, bei dem zwei Kartenspiele mit Standardkarten im Spiel sind. Es kann also doppelte Karten geben, die aber immer noch einzeln gespielt werden.
def removeOne(c: Card, left: List[Card], right: List[Card]): List[Card] = {
if (Nil == right) {
return left
}
if (c == right.head) {
return left ::: right.tail
}
return removeOne(c, right.head :: left, right.tail)
}
def removeCard(c: Card, cards: List[Card]): List[Card] = {
return removeOne(c, Nil, cards)
}
List[Card]
in dieser Frage die Hand eines Spielers?Antworten:
Ich habe diese Möglichkeit in den obigen Antworten nicht gesehen, also:
Bearbeiten:
Wie ein Zauber :-).
quelle
Sie könnten die
filterNot
Methode verwenden.quelle
Sie könnten dies versuchen:
Und als Methode:
quelle
left ::: right.drop(1)
kürzer ist als die if-Anweisung mitisEmpty
.tail
eine leere Liste aufrufen, erhalten Sie eine Ausnahme :scala> List().tail java.lang.UnsupportedOperationException: tail of empty list
.drop(1)
Auf einer leeren Liste wird jedoch eine leere Liste zurückgegeben.tail
löst eine Ausnahme aus, wenn die Liste leer ist (dh es gibt keinehead
).drop(1)
auf einer leeren Liste ergibt nur eine andere leere Liste.Leider hat die Sammlungen Hierarchie selbst in ein bisschen ein Durcheinander mit
-
aufList
. DennArrayBuffer
es funktioniert so, wie Sie vielleicht hoffen:aber leider
List
endete mit einerfilterNot
Implementierung im Stil und macht somit das "Falsche" und wirft eine Abwertungswarnung auf Sie (vernünftig genug, da es tatsächlich istfilterNot
):Am einfachsten ist es also,
List
in eine Sammlung zu konvertieren , die dies richtig macht, und dann wieder zurück zu konvertieren:Alternativ können Sie die Logik des Codes beibehalten, den Sie haben, aber den Stil idiomatischer gestalten:
quelle
removeInt(5,List(1,2,6,4,5,3,6,4,6,5,1))
ergibtList(4, 6, 2, 1, 3, 6, 4, 6, 5, 1)
. Ich denke, das ist nicht das, was du wolltest.quelle
quelle
Als eine mögliche Lösung können Sie den Index des ersten geeigneten Elements finden und dann das Element an diesem Index entfernen:
quelle
span
, um dasselbe zu tun.Wie wäre es mit
Wenn Sie sehen
return
, stimmt etwas nicht.quelle
c
c
, aber nur die ersten sollten entfernt werden.Nur ein weiterer Gedanke, wie man das mit einer Falte macht:
quelle
Generische Schwanzrekursionslösung:
quelle
quelle
quelle
var
s und einerwhile
Schleife ist keine idiomatische Scala.