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
4

1 回答 1

0

这取决于列表本身的实现。如果您可以使用每个元素的唯一哈希来实现您的列表,那么获取一个元素可能非常简单。

所以归结为列表本身的实现。如果它是某种随机访问列表(随时间获取常量),则此操作将很简单。如果列表是纯顺序访问列表,则此选项与您的实现相同。

例如,在使用 Java 时,ArrayList我会这样做:

假设“类型”唯一标识一个元素,我将在 Item 类中有一个正确定义equals的元素。hashcode

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));
于 2012-09-14T17:46:27.357 回答