回答編集履歴

2

追記

2017/04/13 05:36

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -27,3 +27,113 @@
27
27
 
28
28
 
29
29
  (最初の回答に書いた規則は曖昧だったので訂正しました。失礼しました。)
30
+
31
+
32
+
33
+ ---
34
+
35
+
36
+
37
+ 追記:補足された質問内容に従い考えてみました。結論からいうと最初のご質問にあるようなa, bのリストのうちaのみ用いる方法です。ちょっと分かりにくい論理にも見えるのでもっと明解な方法があるかも知れません。
38
+
39
+
40
+
41
+ ```scala
42
+
43
+ object Reorder {
44
+
45
+ case class Order(val next: String, val prev: String)
46
+
47
+
48
+
49
+ def main(args: Array[String]): Unit = {
50
+
51
+ // 並び替え対象リスト
52
+
53
+ val list = Seq("あ", "い", "う", "え", "お", "か")
54
+
55
+ // 順序制約リスト
56
+
57
+ val order = Seq(Order("お","あ"), Order("え","お"))
58
+
59
+
60
+
61
+ // 順序マップを作る(previous -> nextのペア)
62
+
63
+ val orderMap = order.map(o ⇒ o.prev → o.next).toMap
64
+
65
+
66
+
67
+ // 与えた引数から順序マップによって決まる固定的な順列を返す
68
+
69
+ // マップ内に含まれない場合は単に引数を単一要素とする列を返す
70
+
71
+ // (本件の場合"あ"を渡すとSeq("あ", "お", "え")が返ります。
72
+
73
+ def makeOrderedSeq(s: String): Seq[String] = orderMap.get(s) match {
74
+
75
+ case Some(next) ⇒ s +: makeOrderedSeq(next)
76
+
77
+ case None ⇒ Seq(s)
78
+
79
+ }
80
+
81
+
82
+
83
+ // 順序マップ(のnext)に出現しないもののみの列へ要素を挿入
84
+
85
+ val result = list
86
+
87
+ .filter(s ⇒ order.forall(_.next != s))
88
+
89
+ .flatMap(makeOrderedSeq(_))
90
+
91
+ println(s"result = ${result}")
92
+
93
+ }
94
+
95
+ }
96
+
97
+ ```
98
+
99
+
100
+
101
+ 上はあまり処理効率を気にしておらず順序制約のリストの長さが10個やそこらの程度ならよいのですが、それ以上の長さだとmakeOrderedSeqが再帰になっているので危険かも知れません。
102
+
103
+ 再帰を使わないと以下のような不格好なものになってしまいます・・・
104
+
105
+ Scala使いの方には「ひどいコード」と言われてしまいそうですが orz
106
+
107
+
108
+
109
+ ```scala
110
+
111
+ def makeOrderedSeq(s: String): Seq[String] = orderMap.get(s) match {
112
+
113
+ case Some(next) ⇒
114
+
115
+ val b = mutable.Buffer(s)
116
+
117
+ var n = next
118
+
119
+ do {
120
+
121
+ b += n
122
+
123
+ n = orderMap.getOrElse(n, null)
124
+
125
+ } while (n != null)
126
+
127
+ b
128
+
129
+ case None ⇒ Seq(s)
130
+
131
+ }
132
+
133
+ ```
134
+
135
+
136
+
137
+ もっとよい回答があると思いますが自分の程度ではこのくらいの回答が関の山です。
138
+
139
+

1

訂正

2017/04/13 05:36

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -18,6 +18,12 @@
18
18
 
19
19
 
20
20
 
21
- - Shima(α,β)あるとき、Shima(?,α)のようなインスタンスa, bの中にたかだか一つしかない
21
+ - 結果の末尾がShima(α,β)あるとき、a,bの残り要素にShima(?,α)はたかだか一つしかない
22
22
 
23
- - Shima(α,β)に対して、Shima(?,α)が存在しい場合は元のa, bの出現順に並べ
23
+ - 結果の末尾がShima(α,β)であるとき、a,bの残り要素にShima(?,α)がなければa,bの残り要素の先頭を次の要素とす
24
+
25
+ - 結果の最初の要素はa,bの残り要素の中の先頭要素とする
26
+
27
+
28
+
29
+ (最初の回答に書いた規則は曖昧だったので訂正しました。失礼しました。)