Comment puis-je supprimer automatiquement un seul élément d'une liste dans Scala et combler le vide?
Listes immuables Scala, donc j'essaye de comprendre comment je peut "supprimer" - vraiment, créer une nouvelle collection de cet élément, puis fermez l'espace créé dans la liste. Ceci me semble que ce serait un endroit idéal pour l'utilisation de la carte, mais je ne sais pas comment commencer dans cette instance.
Cours est une liste de chaînes. J'ai besoin de cette boucle, car en fait, j'ai plusieurs listes que j'ai besoin de supprimer l'élément à l'index (je suis en utilisant plusieurs listes pour stocker les données associées à travers des listes, et je suis en train de faire cela simplement en veillant à ce que les indices correspondent toujours à travers des listes).
for (i <- 0 until courses.length){
if (input == courses(i) {
//I need a map call on each list here to remove that element
//this element is not guaranteed to be at the front or the end of the list
}
}
}
Permettez-moi d'ajouter quelques détails à ce problème. J'ai quatre listes qui sont associés les uns avec les autres par l'indice; une liste de magasins au cours des noms, on stocke le temps le début de la classe dans un simple int format (c'est à dire 130), l'un des magasins de "am" ou "pm", et l'un des magasins les jours de classes par int (donc "MWF" est évaluée comme 1, "TR" est évaluée comme 2, etc.). Je ne sais pas si le fait d'avoir plusieurs c'est la meilleure ou la "bonne" façon de résoudre ce problème, mais ce sont tous les outils que j'ai (première année comp sci étudiant qui n'a pas programmé sérieusement, depuis que j'avais 16 ans). Je suis en train d'écrire une fonction pour supprimer l'élément correspondant de chacune des listes, et tout ce que je sais, c'est que 1) les indices correspondent et 2) les entrées de l'utilisateur le nom du cours. Comment puis-je supprimer l'élément correspondant de chaque liste à l'aide de filterNot? Je ne pense pas en savoir assez sur chaque liste d'utiliser des fonctions d'ordre supérieur.
source d'informationauteur jkeys
Vous devez vous connecter pour publier un commentaire.
Pour répondre directement à votre question, je pense que vous êtes à la recherche pour
patch
par exemple pour supprimer l'élément d'indice 2 ("c"):où
Nil
est ce que nous sommes en la remplaçant avec, et1
est le nombre de caractères à remplacer.Mais, si vous faites cela:
vous allez passer un mauvais moment. Je vous suggère d'utiliser un
case class
:et de les stocker dans un
Set[Course]
. (Enregistrement de l'heure et les jours commeInt
s n'est pas une bonne idée non plus, - avoir un regard surjava.util.Calendar
à la place.)C'est le cas d'utilisation de
filter
:Vous souhaitez utiliser la carte lorsque vous sont en train de transformer tous les éléments d'une liste.
Tout d'abord, quelques sidenotes:
List
n'est pas un indice basé sur la structure. Tous les index-opérations orientées prendre le temps linéaire. Pour l'index-les algorithmesVector
est un bien meilleur candidat. En fait, si votre algorithme requiert index c'est un signe certain que vous êtes vraiment ne pas s'exposer à la Scala de capacités fonctionnelles.map
sert pour transformer une collection d'éléments "A" de la même collection d'éléments "B" à l'aide d'un passé transformateur fonction à partir d'un seul "A" à un seul "B". Il ne peut pas changer le nombre d'éléments résultant. Probablement que vous avez confondumap
avecfold
oureduce
.De réponse sur la mise à jour de votre question
Bien, voici une solution fonctionnelle, qui fonctionne efficacement sur les listes:
Mais il ya un hic. J'ai réellement venu à être très étonné de découvrir que les fonctions utilisées dans cette solution, qui sont donc de base pour les langages fonctionnels, n'étaient pas présents dans le standard de Scala bibliothèque. Scala a pour 2 et 3-aire n-uplets, mais pas les autres.
Pour résoudre ce que vous aurez besoin de ce qui suit implicite extensions importés.
Cette mise en œuvre nécessite Scala 2.10 car il utilise la nouvelle Valeur effective des Classes de fonctionnalité pour proxénétisme les types existants.
J'ai d'ailleurs inclus dans une petite bibliothèque d'extensions appelées Sexteaprès en fonction de votre projet sur lequel vous serez en mesure de simplement en ajoutant un
import sext._
déclaration.Bien sûr, si vous voulez, vous pouvez simplement composer ces fonctions directement dans la solution:
Du retrait et de la Liste de filtrage des éléments
En Scala vous pouvez filtrer la liste pour supprimer des éléments.
Nous allons les supprimer un couple de classes:
Vous pouvez également utiliser l'option supprimer, mais c'est dépréciée en faveur de filtre ou filterNot.
Si vous souhaitez supprimer par un index, vous pouvez associer chaque élément de la liste avec l'ordre de l'index à l'aide de
zipWithIndex
. Donc,courses.zipWithIndex
devient:List[(java.lang.String, Int)] = List((Artificial Intelligence,0), (Programming Languages,1), (Compilers,2), (Networks,3), (Databases,4))
À supprimer le deuxième élément de ce que vous pouvez vous référer à l'index dans le Tuple avec
courses.filterNot(_._2 == 1)
qui donne la liste:res8: List[(java.lang.String, Int)] = List((Artificial Intelligence,0), (Compilers,2), (Networks,3), (Databases,4))
Enfin, un autre outil est à utiliser
indexWhere
pour trouver l'indice de l'arbitraire d'un élément.courses.indexWhere(_ contains "Languages")
res9: Int = 1
Re votre mise à jour
Similaire à Nikita de la mise à jour de "fusionner" les éléments de chaque liste. Si les cours, meridiems, les jours et les temps doivent être mis dans un Tuple ou de classe afin de conserver les éléments connexes. Ensuite, vous pouvez filtrer sur un élément du Tuple ou un champ de la classe.
Combinant des éléments correspondants dans un Tuple se présente comme suit avec cet exemple de données:
Les combiner avec zip:
courses zip days zip times zip meridiems
val zipped = List[(((java.lang.String, java.lang.String), java.lang.String), java.lang.String)] = List((((Artificial Intelligence,MWF),100),am), (((Programming Languages,TTH),1200),pm), (((Compilers,MW),0100),am), (((Networks,MWF),0900),pm), (((Databases,MTWTHF),0800),am))
Cette abomination aplatit le imbriquée Tuples d'un n-uplet. Il existe de meilleures façons.
zipped.map(x => (x._1._1._1, x._1._1._2, x._1._2, x._2)).toList
Une belle liste de tuples de travailler avec.
List[(java.lang.String, java.lang.String, java.lang.String, java.lang.String)] = List((Artificial Intelligence,MWF,100,am), (Programming Languages,TTH,1200,pm), (Compilers,MW,0100,am), (Networks,MWF,0900,pm), (Databases,MTWTHF,0800,am))
Enfin, nous pouvons filtre basé sur le nom du cours à l'aide de
filterNot
. par exemple,filterNot(_._1 == "Networks")
List[(java.lang.String, java.lang.String, java.lang.String, java.lang.String)] = List((Artificial Intelligence,MWF,100,am), (Programming Languages,TTH,1200,pm), (Compilers,MW,0100,am), (Databases,MTWTHF,0800,am))
La réponse, je suis sur le point de donner peut-être de dépasser ce que vous avez appris jusqu'à présent dans votre cours, donc, si c'est le cas je m'excuse.
Tout d'abord, vous avez droit à la question de savoir si vous devriez avoir quatre listes - fondamentalement, il semble que vous avez besoin est un objet qui représente un cours:
avec laquelle vous pouvez définir un cours individuel
Il y a de meilleures façons de définir ce type (mieux représentations de 12 heures de temps, une meilleure façon de représenter les jours de la semaine, etc), mais je ne compte pas s'écarter de l'original de votre énoncé du problème.
Compte tenu de cela, vous auriez une liste unique de cours:
Et si vous vouliez trouver et supprimer tous cours correspondant à un nom donné, on peut écrire:
De manière équivalente, en utilisant le trait de soulignement sucre syntaxique en Scala pour des littéraux de fonction:
Si il y avait le risque qu'un plus qu'un cours peut avoir le même nom (ou que vous êtes filtrage basé sur certains critères secondaires à l'aide d'une expression régulière ou un préfixe match) et que vous souhaitez la supprimer uniquement la première occurrence, puis vous pouvez définir votre propre fonction pour le faire:
Utiliser le ListBuffer est une mutable Liste comme une liste sur java