[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 = []

에 푸시 MyClass#item1하고 unique_array_of_item1싶지만 아직 unique_array_of_item1포함되지 않은 경우에만 해당됩니다 item1. 내가 아는 간단한 해결책이 있습니다. 반복 my_array하고 unique_array_of_item1이미 현재가 포함되어 있는지 확인하십시오 item1.

더 효율적인 솔루션이 있습니까?



답변

Array 대신 Set 를 사용할 수 있습니다 .


답변

@Coorasse 는 다음과 같은 좋은 답변 을 제공합니다.

my_array | [item]

그리고 my_array제자리 에서 업데이트하려면 :

my_array |= [item]


답변

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)


답변