0
votes

SCALA / JAVA: comparer deux listes / définir et supprimer l'élément correspondant de la liste

J'ai deux listes avec deux types différents, mais les deux types ont le même champ pour identifier / comparer.

Mes exigences: je souhaite comparer deux listes en fonction de certains champs d'objets, une fois correspondant à l'élément Supprimer de la liste. /ensemble. Par exemple: P>

    val type2List = List(
        Type2("name4","surname4", 4)
        )


2 commentaires

Yeh, chaque liste contient des éléments uniques. En fait, c'est une énorme liste de transaction. Aucun élément en double dans les deux liste.


quels champs seraient les identificateurs


3 Réponses :


1
votes

En supposant que vous sachiez dans quel champ vous souhaitez utiliser pour baser votre diff em> sur, voici un aperçu d'une solution.

Définissez d'abord une super classe pour les deux types: P> xxx pré>

Définissez ensuite vos types sous forme de types de types de la classe ci-dessus: p> xxx pré>

maintenant un simple p> xxx Pré>

aboutira: p> xxx pré>

et p> xxx pré>

donnera: p>

List(Type2(name4,surname4,4,dum3))


7 commentaires

Ne fonctionne pas, type1list.diff (type2List) Renvoie la liste des formats zéro.


Voir une version de travail à Ce lien


@ user1662067 Si vous trouvez cette solution appropriée pour votre problème, veuillez envisager d'accepter la réponse ou la convaincre. Merci!


Cela fonctionne .. Pour moi .. Je travaille toujours sur la complexité et la performance de la solution fournie. J'ai une sorte de 1 million d'éléments dans chaque liste?


Toute idée de la complexité de la solution fournie pour si les deux liste ont 1 m enregistrement


@ user1662067 diff met les collections dans un ensemble par défaut de sorte que l'efficacité globale de l'exécution devrait être O (n) .


@ user1662067 Si l'efficacité du temps d'exécution est importante pour vous, je vous suggère de créer des ensembles avant d'appliquer l'autre solution que vous avez acceptée. Dans sa forme actuelle, c'est O (n ^ 2) la complexité du temps d'exécution.



1
votes

Si vous ne pouvez pas régler les types de 2 em>, une solution pragmatique:

Trouvez d'abord le 'Equals' P>

  val filteredType1List = type1List.filterNot(t1 => equals.contains(t1))
  val filteredType2List = type2List.filterNot {
    case Type2(n2, sn2, a2, _) =>
      equals.exists { case Type1(n, sn, a)=>
         n == n2 && sn == sn2 && a == a2
    }
  }


0 commentaires

2
votes

Voici une approche générique de la tâche.
L'idée est de trouver les éléments communs dans les deux listes en fonction des fonctions personnalisées, puis de les supprimer.

final case class Type1(name:String, surname: String, address: Int)
final case class Type2(name:String, surname: String, address: Int, dummy: String)

val type1List = List(
  Type1("name1","surname1", 1),
  Type1("name2","surname2", 2),
  Type1("name3","surname3", 3)
)

val type2List = List(
  Type2("name1","surname1", 1, "blah"),
  Type2("name2","surname2", 2, "blah"),
  Type2("name4","surname4", 4, "blah")
)

val (uniqueType1List, uniqueType2List) =
  removeCommon(type1List, type2List) { type1 =>
    (type1.name, type1.surname, type1.address)
  } { type2 =>
    (type2.name, type2.surname, type2.address)
  }

// uniqueType1List: List[Type1] = List(Type1("name3", "surname3", 3))
// uniqueType2List: List[Type2] = List(Type2("name4", "surname4", 4, "blah"))


3 commentaires

Je l'ai essayé, il a une compilation, les filtres ne sont pas trouvés.


@ user1662067 Oh mon mauvais, c'est parce que la méthode n'existe que sur Scala 2.13 , je modifierai la réponse avec une version qui fonctionne pour 2.12 trop.


@ user1662067 J'ai mis à jour la réponse, s'il vous plaît, essayez d'essayer.