2016-08-07 12 views
3

So habe ich diese 2 Lists:Scala zwischen zwei Listen Basis der Bedingung fusionieren

val names = ListBuffer[(String, Double)] 
names += ("Nat", 11.0) 
names += ("Dan", 12.2) 
names += ("Jeen", 0) 
names += ("David", 55.0) 

val list2 = ListBuffer[(String, Boolean)] 
list2 += ("Nat", false) 
list2 += ("Dan", true) 
list2 += ("Jeen", false) 
list2 += ("David", false) 

Deshalb möchte ich neue List mit allen Namen, die mit dem Wert> 0-"Dan" gleich sind, und der Wert ist true so in mein Beispiel soll dies List mit 1 Elemente zurück:

"Dan", 12.2 
+0

C# Antwort: 'Names.Where (x => x.Item2> 0) .Join (list2.Where (y => y.Item2), x => x.Item1, y => y.Item1, (x , y) => x) .Wobei (x => x.Item1 == "Dan"); 'Oder etwas wie,' names.Concat (list.Select (y => new {y.name, value = Convert. ToDouble (y.condition)})). GroupBy (x => x.name) .Wobei (x => x.Key == "Dan" && x.All (y => y> 0)). Zuerst() ; ' – nawfal

Antwort

2

Try this:

names 
    .zip(list2.map(_._2)) 
    .filter(_._2) 
    .map(_._1) 
    .filter(_._2 > 0) 

Die zip kombiniert die Namensliste mit dem Wahr/Falsch-Wert aus der zweiten Liste (ich habe angenommen Ihre list2 wird auf die gleiche Weise wie names bestellt, wie in Ihrem Beispiel gezeigt, so deshalb können wir den Namen in list2 mit einem Tropfen map, um nur den booleschen Wert abzurufen). Dies führt zu einer Liste wie:

ListBuffer(((Nat,11.0),false), ((Dan,12.2),true), ((Jeen,0.0),false), ((David,55.0),false))

Jetzt filtern wir auf der Wahr/Falsch-Wert (_._2), was in einer Liste wie:

ListBuffer(((Dan,12.2),true))

Jetzt gehen wir nicht brauchen die boolean mehr, fallen, so dass es uns über map(_._1) mit einer Liste von Name-Wert-Tupel zu verlassen, was zu:

ListBuffer((Dan,12.2))

und dann schließlich filtern wir, wo Wert > 0 mit .filter(_._2 > 0), die in Ihrem Beispiel uns noch hinterlässt eine Liste mit dem gleichen Inhalt (versuchen Jeen zu true Änderung diesen letzten Filter in Aktion zu sehen):

ListBuffer((Dan,12.2))

Verwandte Themen