2015-02-08 27 views
0

我有一個作業列表,並且寫了一個規範給以下問題,列表中的一個項目依賴於另一個項目。我得到的結果是兩次返回列表項c。現在的問題是:ruby​​作業單列表中的單個依賴關係正在複製其結果

Given the following job structure: 

a => 
b => c 
c => 
The result should be a sequence that positions c before b, containing all three jobs abc. 

我很困惑,因爲我的測試失敗瞭如下

1) JobsList should return ordered multiple jobs with the dependency if multiple jobs with single dependency were supplied 
    Failure/Error: expect(JobsList.sequence({'a' => nil, 'b' => 'c', 'c' => nil})).to eq ['a', 'c', 'b'] 

     expected: ["a", "c", "b"] 
      got: ["a", "c", "c", "b"] 

     (compared using ==) 

我在這裏無所適從我做錯了任何人都可以提出任何建議?

jobs_list_spec

require 'jobs_list' 

describe JobsList do 

    it "should return an empty sequence of jobs if a blank hash was supplied" do 
     expect(JobsList.sequence({})).to eq []  
    end 


    it "should return an single job character if a single jobs was supplied" do 
     expect(JobsList.sequence({'a' => nil})).to eq ['a']  
    end 

    it "should return multiple jobs characters if a multiple jobs were supplied" do 
     expect(JobsList.sequence({'a' => nil, 'b' => nil, 'c' => nil})).to eq ['a', 'b', 'c']  
    end 

    it "should return ordered multiple jobs with the dependency if multiple jobs with single dependency were supplied" do 
     expect(JobsList.sequence({'a' => nil, 'b' => 'c', 'c' => nil})).to eq ['a', 'c', 'b']  
    end 

jobs_list.rb

class JobsList 
    def self.sequence(jobs={}) 
     grouped_jobs = jobs.group_by{|k, v| v} 
     grouped_jobs.map do |k,v| 
      array = [] 
      if k 
       array = array + [k] 
      end 
      array = array + v.map{|a| a[0]} 
     end.flatten 
    end 
end 
+0

爲什麼你認爲你的算法應該工作?如果你可以解釋你的推理,有人可能會發現一個缺陷(或者你的實現和你認爲你已經實現的區別) – 2015-02-08 12:47:17

回答

1

我不確定是否有你的問題,但你可以試試這段代碼。

class JobsList 
    def self.sequence(jobs={}) 
    jobs.to_a.flatten.uniq.compact 
    end 
end 
+0

謝謝!儘管當我將uniq.compact添加到它所做的代碼的末尾時,它本身並不起作用。你能否解釋你背後的邏輯? – Lilp 2015-02-08 14:00:58

+0

因此,代碼保持與上面相同,但我有end.flatten而不是end.flatten.uniq.compact – Lilp 2015-02-08 14:02:10

+0

嗯,如果你只是想離開你的代碼,那麼你可以只添加uniq。它會從數組中刪除重複的元素。 Compact方法從數組中刪除nil元素,這樣就可以避免在代碼中使用條件語句。 我建議你稍微修改一下這個方法,也許是課程本身。目前它的目的還不清楚,至少對我而言。那很糟糕,尤其是如果除了你以外的人要維護這些代碼。 – bublik42 2015-02-08 15:21:00

1

一些指針,可以幫助:

  1. 嘗試修改類的接口或移動邏輯到CL的實例屁股,而不是在班級方法,因爲它會使它很難與國家合作。
  2. 其次嘗試將功能拆分爲具有表達性名稱的小類,它將幫助您更輕鬆地考慮邏輯。

如果你想保持目前的基於類的接口,想想下面的組織你的類方法:

def self.sequence(jobs) 
    JobList.new(jobs).sequence 
end 

現在,您可以將您的邏輯進入實例的方法;並不是說在類方法之間不能共享實例。但是這種方法可能更容易理解。

如果你完全陷入困境,看看我解決了Ordered Job Kata這個邏輯如何分解。

+0

謝謝你真的很有幫助! – Lilp 2015-02-08 13:59:48

-1
def self.sequence(jobs={}) 
    puts 'hi' 
    grouped_jobs = jobs.group_by{|k, v| v} 
    grouped_jobs.map do |k,v| 
     array = [] 
     if k 
      array = array + [k] 
     end 
     array = array + v.map{|a| a[0]} 
    end.flatten.uniq.compact 
end 
+0

這是一個好主意,可以*解釋*您的代碼,除了發佈它。 – Shepmaster 2015-02-08 17:44:39