前文
ステータスが優先度を持っていると見なされる可能性があることに気付きました。一連の(agent,status)
ペアが与えられた場合、タスクは各エージェントの最も優先度の高いステータスのみを選択することです。残念ながら、ステータスはそのように定義された明示的な順序で強く型付けされていませんが、値が2つしかない文字列であるため、優先度に1:1で対応する文字列の順序を安全に使用できます。
私の答えは両方とも、2つの有用な事実を利用しています。
自然な文字列の順序では、、、"FAIL" < "PASS"
そう:
List("PASS", "FAIL", "PASS").sorted.head = "FAIL"
2つのタプルの 場合(x,a)
、および(x,b)
(x,a) > (x, b)
(a > b)
更新された返信
val solution = l.sorted.reverse.toMap
メソッドを介してaSeq[(A,B)]
をaに変換する場合、タプルの元のシーケンスの各「キー」は、結果のマップに1回だけ表示されます。たまたま、変換はそのような最後の発生を使用します。Map[A,B]
.toMap
l.sorted.reverse = List(
(Agent 2,PASS), // <-- Last "Agent 2"
(Agent 1,FAIL), // <-- Last "Agent 1"
(Agent,PASS),
(Agent,PASS),
(Agent,FAIL)) // <-- Last "Agent"
l.sorted.reverse.toMap = Map(
Agent 2 -> PASS,
Agent 1 -> FAIL,
Agent -> FAIL)
元の返信
答えから始めて...
val oldSolution = (l groupBy (_._1)) mapValues {_.sorted.head._2}
...そして私の作業を示しています:)
//group
l groupBy (_._1) = Map(
Agent 2 -> List((Agent 2,PASS)),
Agent 1 -> List((Agent 1,FAIL)),
Agent -> List((Agent,PASS), (Agent,FAIL), (Agent,PASS))
)
//extract values
(l groupBy (_._1)) mapValues {_.map(_._2)} = Map(
Agent 2 -> List(PASS),
Agent 1 -> List(FAIL),
Agent -> List(PASS, FAIL, PASS))
//sort
(l groupBy (_._1)) mapValues {_.map(_._2).sorted} = Map(
Agent 2 -> List(PASS),
Agent 1 -> List(FAIL),
Agent -> List(FAIL, PASS, PASS))
//head
(l groupBy (_._1)) mapValues {_.map(_._2).sorted.head} = Map(
Agent 2 -> PASS,
Agent 1 -> FAIL,
Agent -> FAIL)
agent -> status
ただし、最初に抽出しなくても、ペアを直接並べ替えることができます_2
。
//group & sort
(l groupBy (_._1)) mapValues {_.sorted} = Map(
Agent 2 -> List((Agent 2,PASS)),
Agent 1 -> List((Agent 1,FAIL)),
Agent -> List((Agent,FAIL), (Agent,PASS), (Agent,PASS)))
//extract values
(l groupBy (_._1)) mapValues {_.sorted.head._2} = Map(
Agent 2 -> PASS,
Agent 1 -> FAIL,
Agent -> FAIL)
いずれの場合も、必要に応じて、ペアのリストに自由に変換して戻すことができます。
l.sorted.reverse.toMap.toList = List(
(Agent 2, PASS),
(Agent 1, FAIL),
(Agent, FAIL))