Gunnar Bittersmann: parallele

Beitrag lesen

@@bleicher:

nuqneH

Alle Zahlenwerte, also Start wie Endwerte, werden aufsteigend sortiert. Startwerte werden mit "+1" gezählt, Endwerte mit "-1". Jetzt geht man nacheinander alle sortierten Werte durch, addiert den Wert (Start/Ende) und ermittelt das Maximum.

wie soll ich das mit einem array an Objekten die Eigenschaften von/bis haben anstellen?

Wo genau hapert’s denn?

In JavaScript könnte das so aussehen: Array aus Objekten mit 'von'- und 'bis'-Eigenschaften mit deinen Beispielwerten:

var bereiche = [  
	{von: 10, bis: 12},  
	{von: 11, bis: 13},  
	{von: 14, bis: 16},  
	{von: 17, bis: 18},  
	{von: 17, bis: 20},  
	{von: 18, bis: 19}  
];

Daraus http://de.selfhtml.org/javascript/objekte/array.htm#push@title=erstellst du ein Array von Bereichsgrenzen. Da du dir auch merken musst, ob die jeweilige Bereichsgrenze Anfangs- odr Endwert ist, sind die Einträge des Arrays auch wieder Arrays aus dem Wert und dem Typen (zur Vereinfachung des späteren Rechnens 1 für Anfangswert, -1 für Endwert):

var bereichsgrenzen = [];  
  
for (var i = 0; i < bereiche.length; i++) bereichsgrenzen.push([bereiche[i].von, 1], [bereiche[i].bis, -1]);

Das Array wird nun http://de.selfhtml.org/javascript/objekte/array.htm#sort@title=sortiert. Dazu brauchst du eine Vergleichsfunktion für die Werte (d.h. die nullten Elemente der Unterarrays), analog zum Beispiel in SELFHTML wäre das 'return a[0] - b[0];'.

Das berücksichtigt aber nicht, dass du bei Gleichheit der Werte (bei deinen Beispielwerten die 18) erst die Endwerte, dann die Startwerte haben willst. (Willst du doch, oder?) Bei Gleichheit der Werte musst du auch noch die Typen (d.h. die ersten Elemente der Unterarrays) vergleichen:

bereichsgrenzen.sort(function (a, b) { return a[0] - b[0] ? a[0] - b[0] : a[1] - b[1]; });

(Willst du erst die Startwerte, dann die Endwerte, hieße es hinten 'b[1] - a[1]'.)

Jetzt gehst du das geordnete Array durch und inkrementierst einen Zähler bei einem Startwert und dekrementierst bei einem Endwert, d.h. du addierst den Wert des jeweiligen ersten Elements der Unterarrays (welches ja den Wert 1 bzw. -1 hat), und merkst dir dabei den Maximalwert dieses Zählers:

var maxOpen = 0;  
  
for (var i = 0, currentOpen = 0; i < bereichsgrenzen.length; i++)  
{  
	currentOpen += bereichsgrenzen[i][1];  
	maxOpen = Math.max(maxOpen, currentOpen);  
}  
  
alert(maxOpen);

Qapla'

--
Volumen einer Pizza mit Radius z und Dicke a: pi z z a