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ようにします。

「タイプ」が要素を一意に識別すると仮定すると、正しく定義されたequalsandhashcodeが Item クラスに含まれます。

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 に答える