2011-01-19 10 views
16

, dizi çıkarma veyaRuby'de, bir Array'da sadece 1 maçı kolayca kaldırabilmenin bir yolu var mı? Ruby

>> [1,3,5,7,7] - [7] 
=> [1, 3, 5] 

>> [1,3,5,7,7].reject{|i| i == 7} 
=> [1, 3, 5] 

reject dizideki tüm girişleri kaldıracak. Sadece 1 oluşumun kaldırılması kolay mı?

+1

Bu ([ "diziden elemanının eşleşen ilk örneğini Sil"] http://stackoverflow.com/questions/4595305/delete-first-instance-of-matching-element-from- çok yakındır dizi). –

cevap

24
>> a = [1,3,5,7,7] 

>> a.slice!(a.index(7)) 
=> 7 

>> a 
=> [1,3,5,7] 
+2

Biri '7' aslında var olduğunu kontrol etmek isteyebilir, aksi takdirde bir tür hatası yükseltebilir. – lulalala

9

aklıma gelen en iyisi: yıkıcı

found = false 
[1,3,5,7,7].reject{|i| found = true if !found && i == 7} 

Veya; doğrudan sorunuza cevap etmese de

arr = [1, 2, 3, 5, 7, 7] 
arr.delete_at(arr.index(7)) 
arr #=> [1, 2, 3, 5, 7] 
+0

Benzer şekilde: arr.slice (arr.index (7)) veya arr.slice! (Arr.index (7)) – andynu

+1

@andynu: Eski hiçbir şey yapmıyor. Bir 'dilim! 'Bunun için çalışır (çünkü bir argümanla çağrıldığında' delete_at 'ile aynı şeyi yapar). – sepp2k

+1

Bu arada, ikinci çözümde, eğer "if" kelimesini eklemeniz gerekebilir, çünkü 'delete_at (nil)' exeption atar. – Nakilon

-4

, uniq istediğini olabilir.

[1,3,5,7,7].uniq # => [1,3,5,7] 
+0

Bu biraz agresif. [1,1,1,1,2,2] .uniq # => [1,2] tek bir yediden çok daha fazla kaldı. – andynu

+0

diğer tüm yinelenen öğeleri de kaldırır, OP'nin istediği bu değildir. – ghostdog74

+0

Ben de soruyu cevaplamadığını söyledim :) Bu OP'nin ne olduğunu tahmin etmeye çalıştığım şeydir * gerçekten * yapmaya çalışıyorum ... – zetetic

İlgili konular