2015-06-12 61 views
0

一個子集,我有車對象的數組在陣列中重複的對象,查找基於屬性的紅寶石

class Car 

    def initialize(engine_size, maximum_speed, acceleration, mass) 
    @engine_size = engine_size 
    @maximum_speed = maximum_speed 
    @acceleration = acceleration 
    @mass = mass 
    end 

end 

,我想通過比較它們的屬性的一個子集,列出相同的汽車,例如:engine_size,加速度和質量。

我嘗試過使用group_by,但是這隻允許我比較整個汽車對象或單個屬性。

+1

你們是不是基於某種共同屬性過濾汽車的陣列,或通過汽車的陣列,以獲得不同的屬性的列表? –

+0

@ Francesco Pirrone - 前者 – pingu

+0

您想要:1)確定哪些車具有指定屬性(例如,@engine_size = 1600','@mass = 2000'等;或2)具有相同值的組車所有的屬性?請編輯您的問題以澄清,因爲有些讀者在評論中可能會錯過您的答案。 –

回答

2
cars.group_by{|car| [car.engine_size, car.accelaration, car.mass]} 
+0

根據OP對問題的評論,你的答案似乎是唯一正確的答案。 –

0

如果你查找docs on group_by,你會發現你可以給它一個塊。如果你讓塊返回你感興趣的屬性的子集,那應該會給你所需的結果。

1

讓我們假設你已經previusly初始化汽車的數組,現在你想有一個2000cc的發動機和質量更1000Kg以上汽車的一個子集:

result = cars.select{|car| car.engine==2000 and car.mass > 1000} 

您也可以,如果使用select!你需要過濾到位。 關於docs的更多信息。

1

這允許您以濾除不同搜索汽車屬性:

class Car 

    attr_reader :engine_size, :maximum_speed, :acceleration, :mass 

    def self.cars_by_attrs(cars, args = {}) 

    return [] if cars.empty? 

    # Checking if all the arguments in args are valid 
    # instance variables on all the cars. 
    all_instance_vars = cars.all? do |car| 
     args.all? do |key, val| 
     car.instance_variables.include? "@#{key.to_s}".to_sym 
     end 
    end 

    unless all_instance_vars 
     raise ArgumentError.new('Instance variable not found.') 
    end 

    cars.select do |car| 
     args.all? do |key, val| 
     # Checking if the instance variables can be retrieved. 
     unless car.respond_to?(key) 
      raise ArgumentError.new('Instance variable not accessible.') 
     end 
     car.send(key) == val 
     end 
    end 
    end 

    def initialize(engine_size, maximum_speed, acceleration, mass) 
    @engine_size = engine_size 
    @maximum_speed = maximum_speed 
    @acceleration = acceleration 
    @mass = mass 
    @test = true 
    end 


end 

cars = [] 
cars << Car.new(10, 20, 5, 6) 
cars << Car.new(10, 20, 7, 8) 
cars << Car.new(12, 21, 9, 10) 
puts Car.cars_by_attrs(cars, engine_size: 10, maximum_speed: 20) 
# First two cars. 
puts Car.cars_by_attrs(cars, mass: 10) 
# 3rd car. 
# puts Car.cars_by_attrs(cars, new: 10) 
# Error ! 
# puts Car.cars_by_attrs(cars, test: 10) 
# Error !