Hallo liebe Kollegen,
ich arbeite zur Zeit an einem Scheduler-Programm.
Jedoch hänge ich momentan an einer Stelle, für die eine bestimmter Algorithmus benötigt wird.
Folgendes Problem soll der Algo lösen können:
-ich habe ein array mit n Feldern int[] myArr = new int[n];
-jetzt sollen alle Wert von allen Feldern einzeln miteinanander verglichen werden
->sagen wir einfach mal n ist 5 dann müssen folgende Felder verglichen werden:
myArr[0] mit myArr[1]
myArr[0] mit myArr[2]
myArr[0] mit myArr[3]
myArr[0] mit myArr[4]
myArr[1] mit myArr[2]
myArr[1] mit myArr[3]
myArr[1] mit myArr[4]
myArr[2] mit myArr[3]
myArr[2] mit myArr[4]
myArr[3] mit myArr[4]
Ich habe da an eine Art verschachtelte Schleifenstruktur gedacht, aber leider komme ich nicht auf die Lösung, weil ja die Anzahl der Arrayfelder erst zur Laufzeit bekannt wird.
Kann mir bitte jemand einen Tip geben?
Grüße saio
Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!
Besten Dank für deine Hilfe habs jetzt so gemacht:
foreach (DateTime i in date)
{
foreach (DateTime j in date)
{
i +=j;
...
}
}
Jedoch brauche ich noch den Index des momentanen Arrays.
In php ging das irgendwie mit key=>var oder so ähnlich.
Geht das auch irgendwie in C#?
Gruß saio
Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!
Das Zauberwort lautet myarray.Length 😁
Hast mich echt gerettet JAck30lena - Danke für das schöne Wochenende 🙂
Viele liebe Grüße
saio 8)
Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!
ständig IndexOf zu benutzen ist aber nicht so toll, weil man dann (wenn der Compiler das nicht wegoptimiert) ständig das gesamte Array durchsucht. Ein Zugriff auf ein diskretes Arrayelement per Index ist dagegen deutlich schneller.
Nur mal als Frage, wozu willst du den jedes mit jedem Vergleichen ?!?!?!?!?!
beste Grüße
zommi
aber er sprach doch sowieso nur von einem einzigen Array, und nich zwei.
Wenn es ihm möglich ist, für seine Objekte nicht bloß die Gleichheit/Ungleichheit festzulegen sondern irgendwie noch ne Ordnung reinbringt (also größer/kleiner zwischen zwei Objekten)
Dann wär es ja für seine Aktion vielleicht auch sinnvoll mit dieser Ordnung zu sortieren.
Und das würde nur einen Aufwand von O(n*logn) anstatt von O(n^2) bedeuten.
Und das "höchsten Wert" rausfinden geht ja eh nur, wenn er ne Ordnung definiert hat.
Und da wäre das sortieren schonmal sinnvoller 🙂
Wobei das höchster Wert rausfinden dann ja sogar in O(n) geht
Gerade deshalb ist es ja interessant zu wissen, was saio wirklich damit machen will 🙂
beste Grüße
zommi
Hallo Ihr Lieben,
finds echt toll, dass Ihr Euch so viele Gedanken gemacht habt, leider war ich da schon im Wochenende... 😁
Ich brauche die Sache, da ich ein Datumsarray mit unbestimmt vielen Feldern habe.
Jetzt soll aus diesem array: date[n], dass früheste Datum in die Variable tempDate gespeichert werden.
Ich habe das jetzt so gelöst:
private DateTime tempDate;
public DateTime nextDate;
private DateTime[] date;
private int[] resID;
public int nextRes;
public void calcNextDate()
{
tempDate = new DateTime(9999, 12, 31);
if (date.Length > 1)
{
for (int i = 0; i < date.Length; i++)
{
for (int j = 0; j < date.Length; j++)
{
if (i != j)
{
if (date[i] <= date[j] && date[i] < tempDate)
{
tempDate = date[i];
}
else if (date[j] <= date[i] && date[j] < tempDate)
{
tempDate = date[j];
}
}
}
}
}
else
{
tempDate = date[0];
}
for (int d = 0; d < date.Length; d++)
{
if (date[d] == tempDate)
{
nextDate = date[d];
nextRes = resID[d];
}
}
}
Für eine performantere Lösung halt ich gern die Lauscher bzw. Augen auf... =)
Liebe Grüße saio
Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!
Du müsstest es noch durchtesten, aber ich denke folgender Code erledigt die gleiche Aufgabe nur halt kürzer.
public DateTime nextDate;
private DateTime[] date;
private int[] resID;
public int nextRes;
public void calcNextDate()
{
int j = 0;
for (int i = 1; i < date.Length; i++)
{
if (date[i] < date[j])
j = i;
}
nextDate = date[j];
nextRes = resID[j];
}
Lg XXX
Hallo xxxprod,
ganz stimmt dein Algorithmus noch nicht.
Wenn das Array mehr als ein Element hat und das erste das kleinste ist, wird es nicht gefunden. Außerdem knallt es, wenn das Array gar keine Elemente hat.
Aber es stimmt natürlich, dass es nicht nötig und erst recht nicht sinnvoll ist, alle Elemente mit allen zu vergleichen, nur weil man das kleinste Element finden will. Da ist dein Ansatz deutlich besser.
herbivore
Hallo,
besten Dank für euer Engagement.
@herbivore:
wie sollte ich deiner Meinung nach den Code gestalten?
Greetz saio
Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!
Hallo Herbivore,
Wenn das Array mehr als ein Element hat und das erste das kleinste ist, wird es nicht gefunden.
ich denke schon das der Algorythmus dieses Element finden würde, da j ja mit 0 initialisiert wird. Das heißt, wenn das erste Element das jüngste ist, dann bleibt j immer 0 🙂
Lg XXX
Hallo xxxProd,
ich habe mal versucht deinen Code mit meinem zu erstzen.
Von der Perfomance her ist es um einiges schneller, jedoch ist nicht unbedingt gesagt, dass date[0] das jüngste Datum als Wert hat.
Trotzdem dank ich Dir für deine Mühe 🙂
LG saio
Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!
Ich hab nicht gesagt das date[0] das jüngste Datum hat, sondern das j aufs jüngste Datum zeigt, und wenn date[0] das jüngste Datum ist, dann bleibt j auch auf 0.
Lg XXX
also wenn das array 0 oder 1 element hat, dann fliegt so ein indexzugriff auf die schnauze ^^
deshalb lieber ein foreach verwenden und man muss sich nicht mehr darum kümmern....
hier mal mein ansatz:
private DateTime GetEarliestNewDate(DateTime[] dateArray)
{
if(dateArray == null)
{
throw new ArgumentNullException("dateArray");
}
long tempTicks = DateTime.MaxValue.Ticks;
foreach (DateTime dtime in dateArray)
{
if(dtime.Ticks < tempTicks)
{
tempTicks = dtime.Ticks;
}
}
return new DateTime(tempTicks);
}
private DateTime GetEarliestDateObject(DateTime[] dateArray)
{
if (dateArray == null)
{
throw new ArgumentNullException("dateArray");
}
DateTime tempDate = DateTime.MaxValue;
foreach (DateTime dtime in dateArray)
{
if (dtime.Ticks < tempDate.Ticks)
{
tempDate = dtime;
}
}
return tempDate;
}
einmal mit der version das es ein komplett neues datetimeobjekt erzeugt und einmal die version die das bereits existierende datetime objekt zurückgibt. das einbinden in deinen quellcode (weil deine private fields nicht gesetzt werden) überlasse ich dir (voraussgesetzt du möchtest diesen lösungsansatz verwenden).
liebe grüsse
Jack
@xxxprod: hm, mit deinem code tut es jetzt anscheinend funktionieren,muss aber noch erst alle eventualitäten prüfen - Gracias 🙂
@Jack: WOW - ok so sieht es wohl aus wenn man alles beim Programmieren berücksichtigt. Aber die Funktion wird eh nur dann aufgerufen, wenn auch wirklich schon ein Wert im Array gesetzt worden ist. Danke Dir Jack... 🙂
Ich versuchs jetzt mal mit prods Variante - schneller ist es auf jeden Fall hoffentlich auch Fehlerfrei.
Bin mal prüfen....
Danke nochmals Euch allen für die Hilfe 👍
Viele liebe Grüße
saio
Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!
Hallo xxxprod,
Das heißt, wenn das erste Element das jüngste ist, dann bleibt j immer 0
stimmt, ich ziehe den Einwand mit dem ersten Element zurück.
herbivore
Nur so als Anmerkung am Rande
Wieso das Rad selber erfinden ?
Array.Sort und dann das Item-0 ziehen
Also insgesamt 2 Zeilen Code
🙂
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
So wie mir das aussieht, stehen die 2 Arrays durch ihre Index-Positionen in Relation.
Dadurch würden es dann wohl wieder mehr als 2 Zeilen werden oder?
Lg XXX
@xxxprod
Ich habe es nur überflogen... aber so weit ich gesehen habe handelt es sich nur um 1 Array...
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hi Programmierhans,
Das Rad neu erfinden würde ich ja nun nich sagen 😉
Und das gesamt Array zu sortieren nur um den größten Wert zu erhalten is halt auch wie mit Kanonen auf Spatzen😉
(Ich nehm ja auch nich Reflection nur um ne Property über GetType, GetProperty und SetValue zu setzen - nur der eleganz willen 😉
beste Grüße
zommi
Hi Programmierhans,
Und das gesamt Array zu sortieren nur um den größten Wert zu erhalten is halt auch wie mit Kanonen auf Spatzen😉
beste Grüße
zommi
Je nach Grösse des Array und Häufigkeit des Aufrufes 🙂
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...