質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

3回答

6113閲覧

なぜString型に比較演算子が使えるのか。

hanzoo

総合スコア28

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/03/04 15:57

編集2016/03/04 16:02

どのように比較して、true/falseが返ってきているのでしょうか。

ある書籍には、『二つの文字列を辞書式順序で比較します。』とあるのですが、
『辞書式順序で比較』という内容がよく理解できていません。

Swift

1var red = "赤" 2var blue = "青" 3 4red < blue // => true 5red > blue // => false

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Swift のことはカケラも知りませんが、一般的にストリング (一般にイメージされる文字列に限らず、ある特定のバイト数の値の 0 個以上の連なり) の大小比較には、よく辞書式順序での比較が使われます。
たとえば、utf-8 だと "赤"0xeb, 0xb5, 0xa4 というバイト列で、"青"0xe9, 0x9d, 0x92 というバイト列で(表現されているシステムもありま)す (endian による)。これを辞書式順序で比較する、とは、まず 1 バイト目の 0xeb0xe9 で比較して 0xeb > 0xe9 なので "赤" > "青" となります。
一般に先頭から 1 バイトずつ比較していき、違いが出たところで大小の判定をします。もし、"abc""abcd" のように同じバイトが続いているうちに一方が末尾にたどり着いた場合はそちらが小になります。
最初に utf-8 なら、と書いたように、encoding によりバイト列としての表現が異なってきますので、一文字が多バイトで表現されるような文字の文字列の辞書式順序はシステムによって違ってきます。
あと、「辞書式」という名前ですが、国語辞典や英和辞典など、普通の書籍の辞書で見出し語を並べる順序と同じということです。

投稿2016/03/04 16:43

unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hanzoo

2016/03/06 05:48

詳しく教えていただきありがとうございます。大変勉強になります。
guest

0

(現行の)コンピュータ処理は本質的に数値計算です。文字の比較なども全て数値としてやっています。
たとえば、アルファベットにはaは1、bは2、cは3、...というように辞書と同じくアルファベット順に数値が割り当ててあります。(ひらがなカタカナなども同様にあいうえお順に割り振ります)
なので
red < blueは一文字目を比較して18 < 2を判断してます。なのでfalse。同様にred > blueは18 > 2なのでtrueという結果を得られます。
bed < blueとすると一文字目は同じなので二文字目以降のed < lueを判断します。

ただし、現実に割り当てる数値はasciiとかunicodeとかの規約で決まってます。

投稿2016/03/05 02:39

NCC1701

総合スコア1680

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hanzoo

2016/03/06 05:49

ありがとうございます。とてもイメージしやすく助かりました。
guest

0

「辞書式順」と言っても、必ずしも辞書と同じ並びではありません。正確には「コード順」ですが、業界では「辞書式順」と言うようです。
swift はどうなっているかは知りませんが、java6クラスString.CompareTo()の仕様では

辞書的の順序の定義を示します。2 つの文字列が異なる場合、両方の文字列に対して有効なインデックスに位置する文字が異なるか、2 つの文字列の長さが異なるか、あるいはその両方が該当します。1 つ以上のインデックスの位置にある文字が異なる場合は、このうちのもっとも小さいインデックスを k とすると、< 演算子を使用して「より小さい」値と判定される、位置 k にある文字を持つ文字列が、もう一方の文字列より辞書的に前になります。この場合、compareTo は 2 つの文字列で位置 k にある 2 つの文字の値の差を返します。 これは次の式で表される値になります。

this.charAt(k)-anotherString.charAt(k)

となっています。これを読んでもよく分かりませんが、「数値」として比較するようです。
(多分、ほとんどの言語はこうだと思います)

つまり、大文字-小文字、ひらがな-カタカナが混在すると、「辞書に並んでいる順」にはなりません。
(例えば Amazon と ANDROID)
本当に辞書と同じ順で比較しようとすると、かなり面倒だと思います。
通常は問題になりませんが、個人名、地名、商品名を並び替える時は本当に「辞書の順」を
要求されるかもしれません。

投稿2016/03/05 03:23

nob.

総合スコア711

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hanzoo

2016/03/06 05:52

名前の通りに辞書と同じ並び順なのかなーと思っていました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問