Anonymous user
Stable marriage problem: Difference between revisions
→{{header|Scala}}: update
(→{{header|Scala}}: unused import removal) |
(→{{header|Scala}}: update) |
||
Line 5,655:
{{trans|Java}}
<lang scala>object SMP extends App {
private def
matches.foreach { e => println(s"${e._1} is engaged to ${e._2}") }▼
println("Marriages are stable")
else
println("Marriages are unstable")
private def swap() {
val girl1 = girls.head
val girl2 = girls(1)
val tmp = girl2 -> matches(girl1)
matches += girl1 -> matches(girl2)
matches +=
println(girl1 + " and " + girl2 + " have switched partners")
else▼
}
private type TM = scala.collection.mutable.TreeMap[String, String]
private def
val engagements = new TM▼
val freeGuys = scala.collection.mutable.Queue.empty ++ guys▼
while (freeGuys.nonEmpty) {▼
val guy = freeGuys.dequeue()▼
val guy_p = guyPrefers(guy)▼
var break = false▼
for (girl <- guy_p)▼
if (!break)▼
if (!engagements.contains(girl)) {▼
engagements += girl -> guy▼
break = true▼
}▼
else {▼
val other_guy = engagements(girl)▼
val girl_p = girlPrefers(girl)▼
if (girl_p.indexOf(guy) < girl_p.indexOf(other_guy)) {▼
engagements += girl -> guy▼
freeGuys += other_guy▼
break = true▼
}▼
}▼
}▼
engagements▼
}▼
if (!girls.toSet.subsetOf(matches.keySet) || !guys.toSet.subsetOf(matches.values.toSet))
return false
val invertedMatches = new TM
matches
for ((k, v) <- matches) {
Line 5,760 ⟶ 5,728:
"ivy" -> List("ian", "col", "hal", "gav", "fred", "bob", "abe", "ed", "jon", "dan"),
"jan" -> List("ed", "hal", "gav", "abe", "bob", "jon", "col", "ian", "fred", "dan"))
private lazy val matches = {
▲ val engagements = new TM
▲ val freeGuys = scala.collection.mutable.Queue.empty ++ guys
▲ while (freeGuys.nonEmpty) {
▲ val guy = freeGuys.dequeue()
▲ val guy_p = guyPrefers(guy)
▲ var break = false
▲ for (girl <- guy_p)
▲ if (!break)
▲ if (!engagements.contains(girl)) {
▲ break = true
▲ }
▲ else {
▲ val other_guy = engagements(girl)
▲ val girl_p = girlPrefers(girl)
▲ if (girl_p.indexOf(guy) < girl_p.indexOf(other_guy)) {
▲ freeGuys += other_guy
▲ break = true
▲ }
▲ }
run()▼
▲ engagements
checkMarriages()
checkMarriages()
}</lang>
{{out}}
|