2015-09-21 8 views
9

ile desteklenmez:önemli hata: kendisiyle bir konum takas Ben rastgele verilen diziden Dizilerin grup var yeni bir dizi oluşturur bu uzantılı Swift 2.0

extension Array { 
    var shuffle:[Element] { 
     var elements = self 
     for index in 0..<elements.count { 
      swap(&elements[index], &elements[ Int(arc4random_uniform(UInt32(elements.count-index)))+index ]) 
     } 
     return elements 
    } 
    func groupOf(n:Int)-> [[Element]] { 
     var result:[[Element]]=[] 
     for i in 0...(count/n)-1 { 
      var tempArray:[Element] = [] 
      for index in 0...n-1 { 
       tempArray.append(self[index+(i*n)]) 
      } 
      result.append(tempArray) 
     } 

     return result 
    } 
} 

Ve ben bunu kullanıyorum Bu:

let mainArr = Array(1...60) 
let suffeldArr = mainArr.shuffle.groupOf(10) 
print(suffeldArr) 

Ve sanki yazdırır:

[[10 random element between 1 to 60], [10 random element between 1 to 60], [10 random element between 1 to 60], [10 random element between 1 to 60], [10 random element between 1 to 60], [10 random element between 1 to 60]] 

Ama bu bana koşmak tim bir hata veriyor Bu hatta e:

swap(&elements[index], &elements[ Int(arc4random_uniform(UInt32(elements.count-index)))+index ]) 

diyor ki: O 1.2 iyi çalışıyordu ama şimdi 2.0 çalışmıyor

fatal error: swapping a location with itself is not supported

.

Bunu nasıl çözeceğimi bilmiyorum.

+0

Not http://stackoverflow.com/a/24029847/1187415 adresindeki kodun bu sorunu gidermek için güncellendiği: http://stackoverflow.com/questions/24026510/how-do-i-shuffle-an-array-in -swift/24029847 # comment52863556_24029847 –

+0

Teşekkürler ... @MartinR –

cevap

11

kendisiyle bir öğe takas çalışıyoruz, size, dizideki aynı noktaya bir öğe takas şöyle çalışmıyoruz olup olmadığını görmek için bir kontrol yapmak gerekir:

extension Array { 
    var shuffle:[Element] { 
     var elements = self 
     for index in 0..<elements.count { 
      let newIndex = Int(arc4random_uniform(UInt32(elements.count-index)))+index 
      if index != newIndex { // Check if you are not trying to swap an element with itself 
       swap(&elements[index], &elements[newIndex]) 
      } 
     } 
     return elements 
    } 
    func groupOf(n:Int)-> [[Element]] { 
     var result:[[Element]]=[] 
     for i in 0...(count/n)-1 { 
      var tempArray:[Element] = [] 
      for index in 0...n-1 { 
       tempArray.append(self[index+(i*n)]) 
      } 
      result.append(tempArray) 
     } 

     return result 
    } 
} 
+0

Evet işe yarıyor! Yardım için teşekkürler .. :) –

+0

@DharmeshKheni de temiz ve basit bir Fisher-Yates karıştırma algoritması için bu cevabı kontrol edin: http://stackoverflow.com/a/24029847/1009013 – vrwim

+0

evet Martin zaten bunu önerdi .. :) –

İlgili konular