2016-12-13 12 views
2

を比較し、変更私のコードは、このコードは私の配列に10の文字列値を入れている、これまでスウィフト3ここで

var counter = 0 
    for i in 0...9 { 
     var val = NamePicker() 

     // array to find duplicates 
     var buttonValues = ["", "", "", "", "", "", "", "", "", ""] // array for button names 
     buttonValues.insert(val, at: counter) 
     print(buttonValues[counter]) 
     counter += 1 
    } 

です。私がしたいことは、私の配列の各値をチェックする方法を見つけることです。私の最終結果配列が["a"、 "a"、 "b"、 "b"、 "c"、 "c"、 "e"、 "f"、 "c"]ならば、同じ名前のトリプルがあるかどうかを確認したい(単一と重複は問題ありません)。しかし、トリプルがある場合は、私のNamePicker()関数から3番目の値を別のvalに変更したいと思います。

はそう

["a","a","a","b","b","c","c","e","f","c"] 

の私の配列と3「」と3「c」は同じの二つはokです持つ、私は新しい値にし、場合には、3番目を変更したい、があります新しい値はもう3倍になり、それ以上トリプルがなくなるまで変化します。

ように配列可能トリプルがどこ変化ここであり

["a","a","f","b","b","c","c","e","f","z"] 

の最終的な結果を有することができます。 これを効率的に行う方法に関するお手伝いはありますか?

+0

アレイを並べ替えることはできますか? – Frankie

+0

配列内のポイントは特定のボタンの名前ではないので、ソートされたすべてのボタンが名前を変更して戻ってきた場合は、ランダムにしたいと思うでしょう。それが理にかなっていれば、すべての値が無作為に動かされることになります。 @Frankie – Shane

+0

すべての値がすでに倍数である場合、どの値を置き換えるべきですか?言い換えれば、あなたの例で '' z ''がどのように選ばれていますか? – OOPer

答えて

0

辞書は私が考える最良の方法です。キーを文字にし、値をその文字のカウントにする。各入力を一度だけ実行する必要があるため、ランタイムはO(n)になります。次に例を示します。

let chars = ["a","a","a","b","b","c","c","e","f","c"] 

var dict = [String: Int]() 

for char in chars { 
    //If already in Dictionary, increase by one 
    if var count = dict[char] { 
     count += 1 
     dict[char] = count 
    } else {//else is not in the dictionary already, init with 1 
     dict[char] = 1 
    } 
} 

出力:

["b": 2, "e": 1, "a": 3, "f": 1, "c": 3] 

は今、私はあなたが3回目の同じ文字の値を置換するかどうかはわかりませんが、これはおそらく最良の方法ですどちらが限界を超えているかを判断するために文字列をグループ化します。

+0

を選択すると、forEachと '??' nil coalescing演算子 'chars.forEach {dict [$ 0] =(dict [$ 0] ?? 0)を使ってループと条件付きを簡略化できます。 + 1} ' –

1

NamePciker()関数で少なくとも5つの異なる値が生成されるため、以下の2つのオプションのいずれも、要件を満たす配列が存在することを示します。


あなたの要件は、あまりにも多くの複製を生成しないことで、より適切に処理されます。それぞれの名前が3回以上繰り返すことができないときあなたが望むすべてが名前の配列がある場合は、これを試してください:あなたはすでに配列を持って、それを修正したい場合は

var buttonValues = [String]() 
var dict = [String: Int]() 

while buttonValues.count < 10 { 
    let name = NamePicker() 
    let count = dict[name] ?? 0 

    guard count < 2 else { continue } 

    buttonValues.append(name) 
    dict[name] = count + 1 
} 

は、次の操作を行います。

var buttonValues = ["a","a","a","b","b","c","c","e","f","c"] 

// Scan the array to tally how many times each name appears 
var totalDict = [String: Int]() 
buttonValues.forEach { totalDict[$0] = (totalDict[$0] ?? 0) + 1 } 

// Now scan it again to update names that appear too many times 
var runningDict = [String: Int]() 
for (index, value) in buttonValues.enumerated() { 
    let count = runningDict[value] ?? 0 

    if count >= 2 { 
     while true { 
      let newValue = NamePicker() 
      let newTotal = (totalDict[newValue] ?? 0) + 1 
      if newTotal < 3 { 
       buttonValues[index] = newValue 
       totalDict[newValue] = newTotal 
       break 
      } 
     } 
    } else { 
     runningDict[value] = count + 1 
    } 
} 
+0

私はコードの最初のブロックを試してみましたが、そのコードで関数を実行するためにボタンを押すと時々動作しますが、他の回は同じ名前の3-4を得ることができます@codeddferent namePicker() – Shane

0

誤った値を挿入し、値が正しいかどうかを確認する代わりに、正しい配列を自動的に作成することをお勧めします。

//array for button names 
var buttonValues = Array<String>() 
//tracks what value has been inserted how many times 
var trackerDict = [String: Int]() 
for i in 0...9 { 

    //we initialize a new variable that tells us if we found a valid value (if the value has not been inserted 2 times already) 
    var foundValidValue = false 
    while !foundValidValue{ 
     var val = NamePicker() 
     //now we check if the value exists and if it is inserted less than 2 times 
     if let count = trackerDict[val] { 
      if count < 2 { 
       foundValidValue = true 
      } 
     } 
     //if we found the value, we can add it 
     if foundValidValue { 
      trackerDict[val] = (trackerDict[val] ?? 0) + 1 
      buttonValues.append(val) 
     } 
     //if we did not find it, we just run through the loop again 
    } 
} 

アレイ内のすべての時間を発生回数を数えるよりも辞書にカウント数を追跡​​するために高速であるので、私は辞書を追加しました。

+0

から来る9-10の異なる名前は、アクションが発生するたびに動作しますが、すべての名前が再び変更されます。 – Shane

+0

アクションではどういう意味ですか? – Yannick

+0

ボタンが押されると、関数が再び実行されて新しい名前が生成されます – Shane

関連する問題