2016-10-28 3 views
0

Swiftを使用すると、約30個の文字列(各文字列は1つの単語)の配列があります。私も変数の文字列を持っていると、文字列が配列内で一致する値を持っているかどうかをチェックしたい。含まれているかforループで、より効率的なのは?

私の質問は、効率の観点から、である、私は使用する必要があります。それによって

if myArray.contains("MyString") { 
    //Do stuff 
} 

それともすべきIループ?効率の観点から

for i in 0..<myArray.count { 
    if myArray[i] == "MyString" { 
     //Do stuff 
    } 
} 
+1

myArray.contains()は配列も列挙しますが、指定された要素が最初に出現した時点で停止します。 –

+4

あなた自身に質問する必要があります:それは重要ですか?そのチェックは、アプリケーションのパフォーマンスのボトルネックですか?答えが「はい」の場合は、機器を使用して測定します。答えが「いいえ」の場合は、より快適に感じるものを選択してください。 –

+0

@MartinRありがとう、ありがとう! –

答えて

2

は、それがすべての配列に存在しない場合、「のmyString」に等しい値に達すると、それが停止するので、myArray.contains("myString")を使用する方が効率的です。 for-loopは、指定した値が見つかった後でもすべての値を処理し続けるため、効率は低下しますが、効率の向上はごくわずかです。

@vadianのように3番目の方法があります。また、while-loopを使用して4番目の方法があります。これは、検索した値が見つかった後で停止することができますが、.contains(...)を使用すると、はるかに読みやすく簡潔になり、したがって私の意見では最良の選択です。

+4

成功時に 'break'文で' for'ループを停止することもできます。 – vadian

2

これは、コードの可読性がパフォーマンスよりも重要なものです。 forループとcontainsの違いは、あなたが使っている本当に巨大な配列を持たない限り、目立たないでしょう。私の意見では、あなたは含む必要があります。

0

あなたが実際にパフォーマンスに気を配り、大きなデータセット、HashSetまたはSwiftであれば、単にSetは、contains呼び出しのO(1)ルックアップ時間を与えます。したがって、より良いデータ構造を使用すると、ここではパフォーマンスに大きな影響がありますが、ループまたはcontains関数を使用する実装の詳細は非ファクタになります。

Set([1, 2, 3, 4, 5]).contains(3) //O(1) 

[1, 2, 3, 4, 5].contains(3) //O(log n) assuming a binary search 
関連する問題