Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Natürliche Sortierung implementieren ("img2.jpg" vor "img10.jpg")
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 891
Herkunft: Hessen

beantworten | zitieren | melden

so guckst du:

string s1basket = "";
string s2basket = "";
int oa;
int ob;
	 		
for (int i=0; i<s1.Length; i++)
{
  if (i ≥ s2.Length) return 1;
  if (Char.IsDigit(s1[i]) && Char.IsDigit(s1[i]))
  {
    oa = 0;
    for (oa=i; oa<s1.Length; oa++)
    {
      if (Char.IsDigit(s1[oa])) s1basket += s1[oa].ToString();
    }

    ob = 0;
    for (ob=i; ob<s2.Length; ob++)
    {
      if (Char.IsDigit(s2[ob])) s2basket += s2[ob].ToString();
    }
  
    if (oa > 0 && ob > 0)
    {
      if (Convert.ToInt64(s1basket) > Convert.ToInt64(s2basket)) return 1;
      return -1;
    }
  }
  if (s1[i] > s2[i]) return 1;	 			
  if (s1[i] < s2[i]) return -1;	
}
if (s1.Length == s2.Length) return 0;
return -1;

also es funktioniert ganz gut. hier und da gibts bestimmt noch fehler. kannst ja mal drüber gucken.
private Nachricht | Beiträge des Benutzers
MastaOfDisasta
myCSharp.de - Member



Dabei seit:
Beiträge: 20
Herkunft: Hamm

beantworten | zitieren | melden

Hi,

ich kommentier mal ein wenig in deinen Quelltext herein
Zitat
Original von -acid-
so guckst du:

string s1basket = "";
string s2basket = "";
int oa;
int ob;
	 		
for (int i=0; i<s1.Length; i++)
{
  if (i ≥ s2.Length) return 1;
  // Die zweite Überprüfung soll vermutlich auf s2 überprüfen, nicht nochmal auf s1. Ich schätze ist nur nen Tippfehler :)
  // Ansonsten schonmal der richtige Ansatz
  if (Char.IsDigit(s1[i]) && Char.IsDigit(s1[i]))
  {
    // Der Teil der jetzt kommt passt noch nicht wirklich
    // Als erstes solltest Du, wie herbi oben schon geschrieben hat, die Länge der Zahl überprüfen, die in Deinem String vorkommt
    // Sind die Zahlen unterschiedlich lang, brauchst Du die einzelnen Ziffern nicht mehr in der Schleife vergleichen, denn die längere Zahl ist auch die grössere
    // Es gilt:   "a10a" > "a9a"


    
    // Warum benutzt Du hier nicht einfach wieder Deine for Schleife, die die Zeichen einzeln vergleicht, wie Du es auch bei Buchstaben machen würdest?
    // Asserdem würdest Du hier auf Probleme laufen, wenn deine strings aus mehreren Kombinationen von Buchstaben und Zahlen bestehen, da Du ungeachtet der Zahlenlänge den string bis zu Schluss durchläufst
    // Es gilt: "a2a" > "a1a9"
    // Bei Dir würd herauskommen: "a2a" < "a1a9"
    oa = 0;
    for (oa=i; oa<s1.Length; oa++)
    {
      if (Char.IsDigit(s1[oa])) s1basket += s1[oa].ToString();
    }

    ob = 0;
    for (ob=i; ob<s2.Length; ob++)
    {
      if (Char.IsDigit(s2[ob])) s2basket += s2[ob].ToString();
    }
  
    if (oa > 0 && ob > 0)
    {
      if (Convert.ToInt64(s1basket) > Convert.ToInt64(s2basket)) return 1;
      return -1;
    }
  }
  if (s1[i] > s2[i]) return 1;	 			
  if (s1[i] < s2[i]) return -1;	
}
if (s1.Length == s2.Length) return 0;
return -1;

also es funktioniert ganz gut. hier und da gibts bestimmt noch fehler. kannst ja mal drüber gucken.

Ich hoffe ich hab mich nirgendwo schwer vertan *g*

Greetz
MoD

Ps: Sorry fürs einmischen
Life is a piece of shit, when you look at it!
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 891
Herkunft: Hessen

beantworten | zitieren | melden

if (Char.IsDigit(s1) && Char.IsDigit(s2)) is klar. danke.

weißt du das problem ist, dass die schleife aufhört zu laufen, wenn

if (s1 > s2) return 1;

kommt. das heißt: aa2.jpg und ab3.jpg hört bei dem dritten zeichen auf, weil 2 ja > 3...
private Nachricht | Beiträge des Benutzers
MastaOfDisasta
myCSharp.de - Member



Dabei seit:
Beiträge: 20
Herkunft: Hamm

beantworten | zitieren | melden

Zitat
Original von -acid-
weißt du das problem ist, dass die schleife aufhört zu laufen, wenn

if (s1 > s2) return 1;

kommt. das heißt: aa2.jpg und ab3.jpg hört bei dem dritten zeichen auf, weil 2 ja > 3...[/quote]

Es ist richtig, dass die äussere for Schleife beim zweiten Durchlauf aussteigt, da
if (s1 < s2) return -1;
"a" < "b"
true ist.
Dein Posting versteh ich aber grad nicht

Der nächste Schritt sollte auf jeden Fall erstmal sein, dass Du Dir in dem "if (Char.IsDigit(s1) && Char.IsDigit(s1))
" etwas ausdenkst um die Länge der in dem String vorkommenden Zahlen zu vergleichen.
Testfälle:

1 = MyClass.NatCompare ("a10a", "a9a1")
-1 = MyClass.NatCompare ("a9a1", "a10a")

Die Schleifen würde ich erstmal auskommentieren.

Greetz
MoD
Life is a piece of shit, when you look at it!
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 891
Herkunft: Hessen

beantworten | zitieren | melden

ja ok. leuchtet mir ein, dass ich nen fehler bekomme, wenn mehrere zahlen in nem string sind (aa10b11), aber ich steh mal wieder aufm schlauch. meine schleife schreibt halt alles in ne sammelvariable und wertet dann aus...

ich wüsste also nicht, wie ich jetzt das problem lösen sollte...
private Nachricht | Beiträge des Benutzers
MastaOfDisasta
myCSharp.de - Member



Dabei seit:
Beiträge: 20
Herkunft: Hamm

beantworten | zitieren | melden

Wie gesagt: Eins nach dem anderen ;-)

Zuerst rausfinden, wie lang die Zahl ist. Haben wir das Problem gelöst ergibt sich die Lösung für Dein Problem mit der Schleife fast von alleine, indem Du die Abbruchbedingung änderst

Greetz
MoD
Life is a piece of shit, when you look at it!
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 891
Herkunft: Hessen

beantworten | zitieren | melden

ei des hab ich doch. ich setze den zeiger auf die erste zahl oa=i und zähle von da aus...
private Nachricht | Beiträge des Benutzers
MastaOfDisasta
myCSharp.de - Member



Dabei seit:
Beiträge: 20
Herkunft: Hamm

beantworten | zitieren | melden

Nein zählen tust du nicht. Du durchläufst den string einfach weiter und führst schon Operationen aus. Das führt zu Problemen. Ich schreibe mal umgangssprachlich auf, was zu tun ist:

if (Char.IsDigit(s1) && Char.IsDigit(s1))
{
ermittle, wie lang die zahl in s1 ist und merke sie dir
ermittle, wie lang die zahl in s2 ist und merke sie dir
vergleiche die länge von der zahlen in s1 und s2
ist die zahl in s1 länger, dann ist s1 der grössere string
ist die zahl in s2 länger, dann ist s2 der grössere string

sind die zahlen gleich lang, dann müssen wir überprüfen, welche zahl grösser ist
}

Den Fall, dass die Zahlen gleich lang sind machen wir später. Erstmal interessiert uns nur der Fall, dass die Zahlen unterschiedliche Länge haben.

Beispiele:
s1 = "a10a" && s2 = "a9a"
s1 = "a9a3" && s2 = "a10a2"

Ich hoffe jetzt ist klarer geworden, was zu tun ist.

Greetz
MoD
Life is a piece of shit, when you look at it!
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 891
Herkunft: Hessen

beantworten | zitieren | melden

pseudocode

was zu tun ist, ist mir schon klar, aber ich kann doch nur ermitteln wieviel zahlen im string sind indem ich das hier mache:

oa = 0;
    for (oa=i; oa<s1.Length; oa++)
    {
      if (Char.IsDigit(s1[oa])) s1basket += s1[oa].ToString();
    }

in s1basket steht jetzt die zahl (unabhäng mal davon, dass auch mehrere zahlen vorkommen können). anders wüsste ich nicht wie...
private Nachricht | Beiträge des Benutzers
MastaOfDisasta
myCSharp.de - Member



Dabei seit:
Beiträge: 20
Herkunft: Hamm

beantworten | zitieren | melden

Ja das ist fast eine Möglichkeit. Nicht unbedingt die performanteste aber es funktioniert. Allerdings solltest Du Dir nicht den String merken sondern mitzählen, wie viele Ziffern Du in Folge findest und wenn das aktuelle Zeichen keine Ziffer mehr ist aus der Schleife springen.

Also:


oa = 0;
int count1 = 0;
    for (oa=i; oa<s1.Length; oa++)
    {
      if (Char.IsDigit(s1[oa])) {
        count1++;
      }
      else {
        break;
      }
    }

Wenn man das für beide strings macht weiss man, wie lang die Zahlen sind.
Bestimmt nicht die eleganteste und schnellste Lösung, aber es funktioniert

Greetz
MoD

Ps: Schön wäre vermutlich, wenn man einen RegEx verwendet.
Life is a piece of shit, when you look at it!
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 891
Herkunft: Hessen

beantworten | zitieren | melden

ok aber:

...
sind die zahlen gleich lang, dann müssen wir überprüfen, welche zahl grösser ist...

kann ich nicht, weil ich nirgends den inhalt (zahl) zwischengespeichert habe, also entweder mache ich das oben gleich mit, oder ich mache das jetzt extra?!
private Nachricht | Beiträge des Benutzers
MastaOfDisasta
myCSharp.de - Member



Dabei seit:
Beiträge: 20
Herkunft: Hamm

beantworten | zitieren | melden

Den Inhalt hast Du doch dadurch, dass Du die Länge hast.
Vergleiche aus Deinen strings genau das Stück, welches die Zahl ist (von Position i bis position i+count1).
Dafür kannst Du dann sogar die wunderbar die String.Compare() Methode verwenden.

Des weiteren würde ich das Vergleichen erst machen, nachdem ich die Längen ermittelt und verglichen hab. Der Grund dafür ist, dass man für das Länge ermitteln eigentlich keine Schleife benutzen möchte.
Man stelle sich vor, man hat einen String der Form "ab"+1MillionZiffern"+"ab"
Dann durchläuft man 2 Millionen mal eine Schleife nur um die Anzahl der Ziffern rauszufinden. Könnte ein bisschen langsam werden das Ganze.

Daher das Vergleichen der beiden Zahlen erst nach dem ermitteln der Längen machen und später das ermitteln der Längen umbauen.
Spontan würde ich auf einen RegEx tippen, der die Zahl ausschneidet und dann nur noch die Length Eigenschaft abgefragt werden muss. Vermutlich immernoch nicht die eleganteste Lösung

Greetz
MoD
Life is a piece of shit, when you look at it!
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo ihr beiden,

@MastaOfDisasta:
Das Einmischen mehr als ok. Das Forum ist ja keine Privatveranstaltung. Ich hatte eher Befrüchtungen, dass -acid- und ich es dazu machen. Bin froh, dass das Thema noch andere interessiert.

Was die die zweimal eine Million Ziffern angeht, denke ich, dass das erstens nicht zu vermeiden ist (jedenfalls nicht, wenn wir hier eine einfach zu programmierende Lösung suchen) und zweitens in der Praxis keine negativen Auswirkungen haben wird. BTW: Auch RexEx können nicht zaubern und müssten den String hier zeichenweise durchsuchen.

@-acid-:
Dein Code von oben ist von der Struktur her schon ziemlich gut. Ich denk, du bist machmal einfach etwas ungeduldig. Wir machen das hier Schritt für Schritt und du wirst sehen, dass am Ende sich schon alles zusammenfügen wird.

Es ist wirklich so: Erstmal brauchen wir nur die Länge der beiden Zahlen, die gerade angefangen haben, mehr nicht!

Wieviele verschiedene Zahlen in dem String wo enthalten sind, ist völlig egal. Nehmen wir nochmal ein Beispiel ohne Zahlen: Wenn man den String aaaa... und aaab... vergleicht, ist für das Ergebnis des Vergleichs doch völlig egal, was nach dem vierten a bzw. dem b kommt. An dieser Stelle unterschieden sich die Strings und der zweite String ist größer als der zweite, fertig. Andererseits interessiert uns die vierte Stelle doch nur deshalb, weil alle Zeichen davor gleich waren.

Das ist der Trick der ganzen Sache: Solange alles gleich ist, machen wir weiter. Wenn es den ersten Unterschied gibt, ist Schluss.

Auf die Zahlen bezogen bedeutet das: Entweder die beiden Zahlen sind gleich (und alles davor natürlich auch), dann interessiert die beiden Zahlen nicht mehr und wir suchen dahinter weiter, oder sie unterscheiden sich, und dann interessiert uns alles dahinter nicht mehr. Was uns interessiert, ist also immer genau das Zeichen oder die Zahl, die wir gerade untersuchen. Alles andere interessiert (gerade) nicht.

Dadurch wird es aber sehr übersichtlich, weil man weder vorausschauen, noch zurückblicken muss (ok, um die Länge der Zahl zu ermitten, muss man natürlich schon vorausschauen, aber das ist auch alles).

Vielleicht hilft das ja schon mal für einen weiteren Versuch.

Als Ergänzung noch folgendes: Wenn du die Länge der beiden Zahlen (sagen wir l1und l2) weißt, gibt es drei Möglichkeiten: Bei l1 <l2 oder l1>l2 machst du gleich ein return, fertig. Und bei l1 == l2 machst du erstmal gar nichts. Dann übernimmt die Hauptschleife das zeichenweise vergleichen der einzelnen Ziffern der Zahlen für dich. Sprich wenn die Zahlen gleich lang sind, werden sie einfach so verglichen, als wären die Ziffern Buchstaben.

Das einzige "Problem" dabei ist, dass, wenn man zur zweiten Ziffer kommt, wieder die Längenermittlung vorgenommen wird. Da sie aber zumgleichen Ergebnis kommt (bzw. kommen muss) funktioniert der Vergleich trotzdem korrekt. Dieses kleine Performanceproblem lösen wir dann im Anschluß.

HTH

herbivore
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 891
Herkunft: Hessen

beantworten | zitieren | melden

Hallo Ihr,

sorry mir gings am Donnerstag und Freitag nicht wirklich gut - wie heute leider, aber ich versuchs mal.

Hier mein bisheriges Ergebnis:

	public int NatCompare(string s1, string s2)
		{
	 		int oa;
	 		int ob;
	 		
 			for (int i=0; i<s1.Length; i++)
	 		{
	 			if (i ≥ s2.Length) return 1;
	 			
	 			if (Char.IsDigit(s1[i]) && Char.IsDigit(s2[i]))
  				{
	 				oa = 0;
					int count1 = 0;
					for (oa=i; oa<s1.Length; oa++)
					{
						if (Char.IsDigit(s1[oa])) count1++;
						else break;
			   		} 
					
					ob = 0;
					int count2 = 0;
					for (ob=i; ob<s2.Length; ob++)
					{
						if (Char.IsDigit(s2[ob])) count2++;
						else break;
			   		}
					
					if (count1 > count2) return 1;
					if (count1 < count2) return 1;
					if (count1 == count2)
					{
					  //hier soll ich ja erstmal nichts machen.	
					}
  				}
	 			
	 			if (s1[i] > s2[i]) return 1;	 			
  				if (s1[i] < s2[i]) return -1;	
 			}
 			
	 		if (s1.Length == s2.Length) return 0;
	 		
			return -1;
		}
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo -acid-,

Hauptsache es geht dir wieder besser. Und das scheint ja so zu sein, denn dein NatCompare ist wirklich gut. Ich gehe mal davon aus, dass das return 1 statt -1 in 'if (count1 < count2) return 1;' lediglich ein Flüchtigkeitsfehler ist. Ansonsten ist, soweit ich das sehen kann, alles richtig. Du hast damit ein NatCompare, das bis auf führende Nullen korrekt funktioniert.

Im Folgenden habe ich das Ganze nur noch ein bisschen abgekürzt. Dazu benutze ich diese vier "Tricks":

1. Es kommt uns ja nicht darauf an, wie lang die beiden Zahlen genau sind, sondern nur welche von beiden länger ist. Deshalb verzichte ich auf count1 und count2. BTW: die Variablen 'oa' und 'ob' habe ich in 'o1' und 'o2' umbenannt, weil die Strings ja auch 's1' und 's2' und nicht 'sa' und 'sb' heißen. Und genau diese 'o1' und 'o2', die angeben, wo die Zahlen zu Ende sind, reichen für den Vergleich, welche Zahl länger ist.

2. Die IsDigit-Bedingung habe ich aus den inneren Schleifen in die Schleifenbedingung gezogen. Das ist nicht nur eleganter, sondern trifft die Sache auch besser, weil es uns ja egal ist, ob die Zahl aufhört, weil der String zu Ende ist oder keine Ziffer mehr kommt. Diese Bedingungen sind gleichwertig und sollten deshalb an gleicher Stelle erscheinen.

3. Das Feststellen der Länge kann gleich bei i+1 beginnen, denn für i wissen wir ja schon, dass dort Ziffern stehen (und das der String bei i noch nicht zu Ende ist, wissen wir auch).

4. Die Abfrage o1 == o2 (früher count1 == count2) ist nicht nötig, weil an dieser Stelle o1 automatisch gleich o2 sein muss. Wäre o1 < o2 wären wir durch das eine return ausgestiegen, bei o1 > o2 durch das andere, also kommen wir an die Stelle nur, wenn o1 == o2.

Somit sieht das Ganze jetzt so aus:


public int NatCompare(string s1, string s2)
{
   int o1;
   int o2;

   for (int i=0; i<s1.Length; i++) {
      if (i ≥ s2.Length) return 1;

      if (Char.IsDigit(s1[i]) && Char.IsDigit(s2[i])) {
         for (o1=i+1; o1<s1.Length && Char.IsDigit(s1[o1]); o1++) { }
         for (o2=i+1; o2<s2.Length && Char.IsDigit(s2[o2]); o2++) { }
         if (o1 > o2) return 1;
         if (o1 < o2) return -1;
         //hier soll ich ja erstmal nichts machen.
      }

      if (s1[i] > s2[i]) return 1;
      if (s1[i] < s2[i]) return -1;
   }

   if (s1.Length == s2.Length) return 0;

   return -1;
}
Jetzt wollen wir noch verhinden, dass die Längen der Zahlen immer wieder ermittelt werden. Dazu reicht eine einfache boolsche Variable, die uns anzeigt, ob wir das schon gemacht haben. Du kannst dich daran gerne selber versuchen. Dann solltest du aber erstmal nicht weiterlesen, weil hier gleich eine mögliche Lösung folgt:


public int NatCompare(string s1, string s2)
{
   int o1;
   int o2;
   bool fInsideNumber = false;

   for (int i=0; i<s1.Length; i++) {
      if (i ≥ s2.Length) return 1;

      if (fInsideNumber) {
         if (!char.IsDigit (s1 [i])) {
            fInsideNumber = false;
         }
      } else {
         if (Char.IsDigit(s1[i]) && Char.IsDigit(s2[i])) {
            for (o1=i+1; o1<s1.Length && Char.IsDigit(s1[o1]); o1++) { }
            for (o2=i+1; o2<s2.Length && Char.IsDigit(s2[o2]); o2++) { }
            if (o1 > o2) return 1;
            if (o1 < o2) return -1;
            fInsideNumber = true;
         }
      }

      if (s1[i] > s2[i]) return 1;
      if (s1[i] < s2[i]) return -1;
   }

   if (s1.Length == s2.Length) return 0;

   return -1;
}
Du solltest jetzt die Testfälle erweitern, so dass auch Strings mit Zahlen vorkommen. Dann kannst du das NatCompare draufloslassen und schauen, ob unsere Erwartungen erfüllt werden.

Bleiben noch die führenden Nullen. Ich kann schon mal soviel sagen. Die führeden Nullen zu berücksichtigen erfordert mehr Aufwand, als ich ursprünglich dachte. Die Routine wurde bei mir gegenüber der bisher letzten Version (die mit fInsideNumber) um ca. 2/3 länger. Das ist schon eine gewisse Herausforderung.

Aber gehen wir das systematisch an: Zunächst müssen wir vor dem Zahlenlängenermitteln die führenden Nullen überspringen (und uns deren Anzahl merken). Nach dem Zahlenlängenermitteln vergleichen wir wie gehabt die Zahlenlängen. Wenn diese gleich sind, müssen die Zahlen selbst verglichen werden (das macht wieder die Hauptschleife, die jetzt aber berücksichtigen muss, dass wir - ggf. unterschiedlich(!) viele - führende Nullen übersprungen haben). Erst wenn die Zahlen gleich sind, kommen die führenden Nullen wieder ist Spiel. Dann sollte die Zahl größer sein, die mehr führende Nullen besitzt. Leider müssen wir an verschiedenen Stellen berücksichtigen, ob bzw. dass die Zahlen gerade zu Ende sind. Eine Stellle ist natürlich bei 'fInsideNumber = false;'. Die andere Stelle ist aber hinter der Hauptschleife, nämlich wenn die Zahlen am Ende der Strings zu Ende sind.

Vermutlich ist es um einiges einfacher, erstmal eine Version zu erstellen, die führende Nullen nur überspringt/ignoriert und diese Überspringen in der Hauptschleife berücksichtigt.

herbivore
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 891
Herkunft: Hessen

beantworten | zitieren | melden

Hm ok. Also das mit den führenden Nullen gehe ich später an. Leider sortiert er nicht richtig.

1.jpg
10.jpg <-- falsch...
11.jpg
12.jpg
13.jpg
14.jpg
15.jpg
16.jpg
17.jpg
18.jpg
19.jpg
2.jpg
20.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg
ab1000.jpg <-- falsch...
ab256.jpg
wallpaper.jpg
z.jpg
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo -acid-,

das liegt aber dann aber wohl nicht nicht an dem NatCompare (oder hast du noch das falsche 'return 1;' statt 'return -1;' drin). Ich habe es bei mir getestet (die Version mit dem fInsideNumber) und da geht es.

herbivore
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 891
Herkunft: Hessen

beantworten | zitieren | melden

*argh*
Ich könnte mich manchmal für meine Fehler selbst schlagen. *autsch*

So Thema führende Nullen. Ich versuchs dann mal...
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 891
Herkunft: Hessen

beantworten | zitieren | melden

Ok, bevor ich jetzt wieder ewig falsch programmiere, wollte ich erstmal etwas Klarheit schaffen, deswegen teile ich das Ganze mal in noch kleinere Schritte

1. Ich prüfe also vor "if ('fInsideNumber)" mit "if (s1 == '0')" auf eine Null.
2. Mach ich jetzt einfach ne Variable und erhöhe die +1 oder muss ich da wieder ne for-Schleife nutzen, um die Anzahl der Nullen zu speichern?
3. Jetzt soll ich soll "überspringen" (Schleife weiterlaufen lassen) - das tue ich mit return -1 ?!
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo -acid-,

zu 1. Nein, das Testen auf führende Nullen musst du nur einmal am Begin der Zahlen durchführen, also direkt nach 'if (Char.IsDigit(s1) && Char.IsDigit(s2)) {'.

zu 2. Du brauchst zwei neue for-Schleifen und zwei neue Varaiblen, um dir die Anzahl der führenden Nullen der beiden Zahlen zu merken.

zu 3. 'return -1' verlässt NatCompare. Das ist so ziemlich das Gegenteil von 'die Schleife weiterlaufen lassen' :-) Beim "Überspringen", kommen jetzt die beiden neuen Variablen aus 'zu 2.' in Spiel, d.h. "übersprungen" wird, in dem in s1 zu i die Anzahl der "übersprungenen" Nullen hinzugefügt wird, bei s2 natürlich entsprechend. Also an allen Stellen, wo i (lesend) benutzt wird, muss man immer die Anzahl der führenden Nullen hinzurechen.

herbivore
private Nachricht | Beiträge des Benutzers
Entwickelt mit ♥ und ASP.NET Core. Version 0.1.336+f0e03bbdd6 vom Uhr. Betrieben auf Azure App Service (debian.10-x64 mit .NET 5.0.11)
Copyright 2003-2021 myCSharp.de - Alle Rechte vorbehalten. Benutzerinhalte unterliegen cc-by-sa 4.0