2012-09-14 75 views
1

所以,我有一個對象的列表,我想更新匹配一些條件的項目,並插入一個對象,如果沒有匹配。我提出的代碼看起來並不高雅,它像這樣:一個優雅的方式來插入列表

def upsert(type, text) 
    messages.each do |message| 
    if message.type == type 
     message.text = text 
    end 
    end 

    unless messages.any?{|message| message.type == type} 
    messages.insert(Message.new(type, text)) 
    end 
end 

回答

0

這取決於列表本身的實現。如果您可以使用每個元素的唯一散列來實現您的列表,則獲取元素可能非常簡單。

所以歸結爲列表本身的實現。如果它是某種隨機訪問列表(隨着時間的推移獲取常量),該操作將很簡單。如果列表是一個純粹的順序訪問列表,則此優化將與您的實現相同。

例如,在一個Java ArrayList我這樣做:

假設「類型」唯一地標識的元件,我想有一個correctly在項目類中定義equalshashcode

if(list.contains(item)) 
{ 
    Item item = list.get(list.indexOf(item)); 
    item.setText(text); 
} 
else 
{ 
    list.add(item); 
} 

如果type不是唯一的,那麼實施仍然是可能的。底線是列表的實施。憑藉良好的隨機訪問列表,事情幾乎都是簡單:

if(!list.contains(item)) 
{ 
    return; 
} 
do 
{ 
    int i = list.indexOf(item); 
    Item item = list.get(i); 
    item.setText(text); 
    list = list.subList(i+1, list.size()); 
} while(list.indexOf(item) != list.lastIndexOf(item)); 
+0

號,類型不唯一標識的元素,因而多個項目可以更新 – synapse

+0

在這種情況下,你需要一個更簡潔的方法。您仍然可以使用散列和隨機訪問列表。底線保持不變:取決於列表的類型。看到我更新的答案。 – Nivas

相關問題