Ho una matrice di elementi, ognuno con un'ora di inizio e un'ora di fine.
Questi formano una timeline, alcuni dei quali si sovrappongono e altri che non lo fanno (e hanno uno spazio tra i gruppi di elementi sovrapposti).
Ho scritto un codice che rimuove gli spazi tra gli elementi non sovrapposti (le linee rosse come nell'immagine qui sotto), tuttavia sta iniziando a diventare un po 'disordinato e non a casi da non perdere.
Esistegiàunalgoritmocherimuoveràglispazirossiesposteràtuttoinordine?
Ilmiocodicestabèsotto:
//sortbytime,lowesttohighestentries.Sort((a,b)=>a.TimeOffset.CompareTo(b.TimeOffset));varlookingForFirstGap=true;varstoredOffset=0.0;varindexToTrimFrom=0;for(vari=0;i<entries.Count-1;i++){//varprevious=entries[i-1];varcurrent=entries[i];varnext=entries[i+1];//vardistanceBack=previous.TimingsAbsolute.End-current.TimingsAbsolute.Start;vardistanceForward=next.TimingsAbsolute.Start-current.TimingsAbsolute.End;Console.WriteLine("Distance {0} -> {1} is {2}", i, i+1, distanceForward);
if (!(distanceForward > 0))
continue;
if (lookingForFirstGap)
{
indexToTrimFrom = i + 1;
Console.WriteLine("To trim from " + indexToTrimFrom);
storedOffset = distanceForward; // we have found a gap, store the amount
lookingForFirstGap = false; // now start looking for element where there is a gap after it
}
else
{
var indexToTrimTo = i;
for (var x = indexToTrimFrom; x <= indexToTrimTo; x++)
{
// trim all
Console.WriteLine("Adjust [" + x + "] by " + storedOffset);
}
if (distanceForward > 0)
{
indexToTrimFrom = i + 1;
Console.WriteLine("To trim from " + indexToTrimFrom);
storedOffset = distanceForward; // we have found a gap, store the amount
}
else
lookingForFirstGap = true; // start looking for gap again
}
}