-1

私はこのようなPOCOを持っています:

class Poco{
    int first;
    int last;
    int category;
}

そしてリスト

List<Poco> pocoList;

指定したカテゴリのアイテムと重複するリストからアイテムを削除する必要があります。オーバーラップは次のように定義されています。

if (a.category!=category && (a.first >= b.first && a.first <= b.last) || (a.last >= b.first && a.last <= b.last)){
  // delete item a 
}

重複する 2 つのアイテムが同じカテゴリになることはありません。最後は常に最初よりも大きくなります。最初と最後は範囲を定義します。複数の重複がある可能性があります。

リストは、List[n].start < List[n+1].start が常に true になるように並べ替えられます。

たとえば、カテゴリが 10 の場合、カテゴリが 10 ではなく、そのアイテムの範囲の一部がカテゴリ 10 のアイテムの範囲と重なっているすべてのアイテムを削除する必要があります。

私の現在の実装は大雑把で、アプリのプロファイリングでは、それが使用されている処理ブランチの全体時間の 65% 以上がこのループで費やされていることがわかりますが、驚くことではありません。

for (int i=object.pojoList.Count-1;i>=0;i--){
    for (int j=object.pocoList.Count-1;j>=0;j--){
        if (pocoList[i].overlaps(pocoList[j],category){
            pocoList.RemoveAt(j);
        }            
    }
}

コンパレータまたはLINQを使用してアイテムを削除する方法が必要だと思いますが、わかりません。

助言がありますか?ありがとうございました。

4

2 に答える 2

1

入力リストが整っているので、start次のようなものを試すことができます

List<Poco> potentialOverlaps = new List<Poco>();
for (int i = 0; i < pocoList.Count; i++)
{
    var currentPoco = pocoList[i];

    // Clear out overlaps that end before this poco starts.
    potentialOverlaps.RemoveAll(p => p.last < currentPoco.first);

    if (currentPoco.category == category)
    {
        potentialOverlaps.Add(currentPoco);
    }
    else if (potentialOverlapsCount > 0)
    {
        pocoList.RemoveAt(i);
        i--;
    }
}

結果はコードが与えるものと同じではないかもしれませんが、記述された動作と一致するはずです。

Poco選択したカテゴリの「まだ終了していない」を追跡します。カテゴリ外に出くわし、Poco「まだ終了していない」ものがある場合は、それらのいずれかと重複する必要があるため、削除できます。

于 2012-12-03T11:20:56.380 に答える
0

クラスに IComparer を実装させることができます。

Compare(Object, Object) メソッドを実装して、それぞれ大きい、等しい、または小さい場合に 1、0、または -1 を返すようにする必要があります。

良い例のソース:リンク

一方のリストに他方の区切り文字を設定できます。次に、上記の方法を使用して並べ替えるときに、値が区切り記号の範囲と重なる場合は、代わりに削除します。

于 2012-12-03T10:49:32.240 に答える