루비 클래스가 있습니다
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 = []
에 푸시 MyClass#item1
하고 unique_array_of_item1
싶지만 아직 unique_array_of_item1
포함되지 않은 경우에만 해당됩니다 item1
. 내가 아는 간단한 해결책이 있습니다. 반복 my_array
하고 unique_array_of_item1
이미 현재가 포함되어 있는지 확인하십시오 item1
.
더 효율적인 솔루션이 있습니까?
답변
Array 대신 Set 를 사용할 수 있습니다 .
답변
답변
my_array
손 으로 반복 할 필요가 없습니다 .
my_array.push(item1) unless my_array.include?(item1)
편집하다:
Tombart가 그의 의견에서 지적했듯이 사용 Array#include?
은 그다지 효율적이지 않습니다. 작은 어레이의 경우 성능에 미치는 영향은 무시할 만하다고 말하고 싶지만 Set
더 큰 어레이를 사용하는 것이 좋습니다 .
답변
item1을 배열로 변환하고 결합 할 수 있습니다.
my_array | [item1]
답변
Set 클래스와 | 메소드 ( “Set Union”이라고도 함)는 고유 한 요소 의 배열을 생성합니다 . 이는 중복을 원하지 않는 경우 좋지만 원래 배열에 디자인 상 고유하지 않은 요소가있는 경우에는 불쾌한 일이 될 것입니다.
원래 배열에 잃고 싶지 않은 중복 요소가 하나 이상있는 경우 조기 반환으로 배열을 반복하는 것은 최악의 경우 O (n)이며, 이는 대규모 계획에서 그리 나쁘지 않습니다. .
class Array
def add_if_unique element
return self if include? element
push element
end
end
답변
완벽한 솔루션인지 확실하지 않지만 나를 위해 일했습니다.
host_group = Array.new if not host_group.kind_of?(Array)
host_group.push(host)