Saya memiliki kelas Ruby
class MyClass
attr_writer :item1, :item2
end
my_array = get_array_of_my_class() #my_array is an array of MyClass
unique_array_of_item1 = []
Saya ingin mendorong MyClass#item1
ke unique_array_of_item1
, tetapi hanya jika unique_array_of_item1
belum berisi itu item1
. Ada solusi sederhana yang saya tahu: cukup lakukan iterasi my_array
dan periksa apakah unique_array_of_item1
sudah berisi arus item1
atau tidak.
Apakah ada solusi yang lebih efisien?
Set#each
danSet#to_a
) yang didelegasikan@hash
. Dan mulai dari Ruby 1.9, Hash sudah dipesan. "Hash menghitung nilainya dalam urutan saat kunci yang sesuai dimasukkan." ruby-doc.org/core-1.9.1/Hash.html@Coorasse memiliki jawaban yang bagus , meskipun seharusnya:
my_array | [item]
Dan untuk memperbarui
my_array
di tempat:my_array |= [item]
sumber
my_array |= [item]
yang akan diperbaruimy_array
di tempat|=
berfungsi dengan baik dalam pengujian saya dengan 2.1.1. Jelaskan kasus pengujian Anda atau buka pertanyaan baru.Anda tidak perlu mengulanginya
my_array
dengan tangan.my_array.push(item1) unless my_array.include?(item1)
Edit:
Seperti yang ditunjukkan Tombart dalam komentarnya, menggunakan
Array#include?
tidak terlalu efisien. Saya akan mengatakan dampak kinerja dapat diabaikan untuk Array kecil, tetapi Anda mungkin ingin memilih yangSet
lebih besar.sumber
array.include?(item)
memiliki kompleksitasO(n)
- jadi seperti mengulang seluruh larik. lihat patokan ini: gist.github.com/deric/4953652[1, 2, 3, 4, 5].bsearch { |e| e == 3 }
Anda dapat mengonversi item1 ke array dan menggabungkannya:
my_array | [item1]
sumber
|
tidak||
(lihat jawaban Jason)Penting untuk diingat bahwa kelas Set dan | metode (juga disebut "Set Union") akan menghasilkan array elemen unik , yang sangat bagus jika Anda tidak menginginkan duplikat tetapi akan menjadi kejutan yang tidak menyenangkan jika Anda memiliki elemen non-unik dalam array asli Anda dengan desain.
Jika Anda memiliki setidaknya satu elemen duplikat dalam larik asli yang tidak ingin hilang, melakukan iterasi melalui larik dengan pengembalian awal adalah kasus terburuk O (n), yang tidak terlalu buruk dalam skema besar .
class Array def add_if_unique element return self if include? element push element end end
sumber
Saya tidak yakin apakah ini solusi yang sempurna, tetapi berhasil untuk saya:
host_group = Array.new if not host_group.kind_of?(Array) host_group.push(host)
sumber