私はこのコードを持っています:
int LRLength = LR.Count;
for (int i = 0; i < LR.Count; i++)
{
LRLength = LR.Count;
LR = merge(LR);
if (LR.Count < LRLength)
{
LR = merge(LR);
if (LR.Count == LRLength)
{
break;
}
}
}
そしてこれは関数のマージです:
private List<Lightnings_Extractor.Lightnings_Region> merge(List<Lightnings_Extractor.Lightnings_Region> Merged)
{
List<Lightnings_Extractor.Lightnings_Region> NewMerged = new List<Lightnings_Extractor.Lightnings_Region>();
Lightnings_Extractor.Lightnings_Region reg;
int dealtWith = -1;
for (int i = 0; i < Merged.Count; i++)
{
if (i != dealtWith)
{
reg = new Lightnings_Extractor.Lightnings_Region();
if (i < Merged.Count - 1)
{
if (Merged[i].end + 1 >= Merged[i + 1].start)
{
reg.start = Merged[i].start;
reg.end = Merged[i + 1].end;
NewMerged.Add(reg);
dealtWith = i + 1;
}
else
{
reg.start = Merged[i].start;
reg.end = Merged[i].end;
NewMerged.Add(reg);
}
}
else
{
reg.start = Merged[i].start;
reg.end = Merged[i].end;
NewMerged.Add(reg);
}
}
}
return NewMerged;
}
このクラスでは:Lightnings_Extractor.Lightnings_Region2つのint変数しかありません。この関数のアイデアは、リストを取得し、合同な領域をマージすることです。
たとえば、関数を呼び出して、リストLRの長さが8になったら、元に戻す回数を減らします。たとえば、2つのインデックスを1つにマージする必要がある場合、代わりに取得するリストの長さは7になります。別のインデックスをマージする必要がある場合、長さは6になります。
上記の最初のコードで確認したいのは、インデックスをマージするための関数の呼び出しをいつ停止する必要があるかです。
長さが8で、次回も8の場合は、ループを停止することはできません。長さが8で、次に7の場合は、関数を再度呼び出します。長さが7の場合、ループを停止します。ただし、長さが6の場合は、もう一度呼び出し続けます。
最後の長さが前の長さと同じになるまで!!!
だから私はこのコードを試しましたが、うまくいきません:
int LRLength = LR.Count;
for (int i = 0; i < LR.Count; i++)
{
LRLength = LR.Count;
LR = merge(LR);
if (LR.Count < LRLength)
{
LR = merge(LR);
if (LR.Count == LRLength)
{
break;
}
}
}