Zero-Wisser: Natürliche Reihenfolge der natürlichen Zahlen feststellen

Hmm, sollte eigentlich einfach sein: Aber ich kanns leider nicht. Mit natürlicher Reihenfolge meine ich

1, 2, 3, 4, 5 etc.

Also wenn z.B. eine Zahl fehlt, ist das.keine natürliche Reihenfolge

1, 2, 4, 5, 6 etc.

Ich möchte also (möglichst einfach) feststellen, ob die Zahlen, die ich in einer for-Schleife ermittle, der natürlichen Reihenfolge folgen oder nicht.

  1. Ich möchte also (möglichst einfach) feststellen, ob die Zahlen, die ich in einer for-Schleife ermittle, der natürlichen Reihenfolge folgen oder nicht.

    die aktuelle Zahl muss um 1 größer als die vorhergehende sein - reicht das als Tipp?

    1. Ich möchte also (möglichst einfach) feststellen, ob die Zahlen, die ich in einer for-Schleife ermittle, der natürlichen Reihenfolge folgen oder nicht.

      die aktuelle Zahl muss um 1 größer als die vorhergehende sein - reicht das als Tipp?

      Ja, danke, für den Tip, aber er scheint mir wenig zu nützen.

      Zum Vergleich, ob die Zahlen der natürlichen Reihe folgen, nehme ich den Zähler der Schleife, der jeweils um eins erhöht wird.

      Ich will die Zahlen um jeweils eins erhöhen, aber nur wenn sie zur natürlichen Folge gehören. Wenn sie nicht zur natürlichen Folge gehören, sollen sie unangetastet bleiben.

      Wie es aussieht, benötige ich mehrere Bedingungen für dieses Vorhaben.

      1. Om nah hoo pez nyeetz, Zerp-Wisser!

        Den Zähler einer for-schleife zu manipulieren ist nicht immer eine gute Idee. Ich werde auch nicht ganz so schlau draus, was du eigentlich willst.
        Ich unterstelle, es gibt ein Array von Zahlen. wert[0], wert[1] ....

        function teste_auf_reihenfolge(wert)  
        {  
          for (var i = 1; i <= wert.length; i++)  
          {  
            if (wert[i] - wert[i-1] != 1) return false;  
          }  
          return true;  
        }  
        
        

        ungetestet

        Erläuterung:

        Du übergibst der Funktion das Array und überprüfst für jedes Element, ob es um eins größer als sein Vorgänger ist. Sobald das für ein Element nicht der Fall ist, wird false zurückgegeben, wenn die Schleife vollständig durchlaufen wird, gibt die Funktion true zurück. Anhand des Rückgabewertes kannst du nun reagieren

        Matthias

        --
        1/z ist kein Blatt Papier.

        1. function teste_auf_reihenfolge(wert)

          {
            for (var i = 1; i < wert.length; i++)
            {
              if (wert[i] - wert[i-1] != 1) return false;
            }
            return true;
          }

          
          > ungetestet  
            
          "<" statt "<=", denn wert[wert.length] gibt es nicht.  
            
          meine Variante:  
            
          ~~~javascript
          function teste_auf_reihenfolge(wert) {  
             var r=true;  
             for (var i = 1; (i < wert.length) && r; i++) {  
               r= (wert[i] - wert[i-1] == 1);  
             }  
             return r;  
           }  
          
          

          ungetestet

          1. [latex]Mae  govannen![/latex]

            function teste_auf_reihenfolge(wert)

            {
              for (var i = 1; i < wert.length; i++)
              {
                if (wert[i] - wert[i-1] != 1) return false;
              }
              return true;
            }

            
            > > ungetestet  
            >   
            > "<" statt "<=", denn wert[wert.length] gibt es nicht.  
            >   
            > meine Variante:  
            >   
            > ~~~javascript
            
            function teste_auf_reihenfolge(wert) {  
            
            >    var r=true;  
            >    for (var i = 1; (i < wert.length) && r; i++) {  
            >      r= (wert[i] - wert[i-1] == 1);  
            >    }  
            >    return r;  
            >  }  
            > 
            
            

            ungetestet

            var ergebnis = wert.every(function (val, i, arr) {  
                return (i == 0) ? true : (val == (arr[i - 1] + 1));  
            });
            

            Stur lächeln und winken, Männer!
            Kai

            --
            „Die Borg würden nicht mal Spaß verstehen, wenn sie einen Vergnügungspark assimiliert hätten!” (B'Elanna Torres)
            SelfHTML-Forum-Stylesheet
      2. Wie es aussieht, benötige ich mehrere Bedingungen für dieses Vorhaben.

        Wir auch, um die Frage so zu verstehen wie du sie meinst :-)

        Wann willst du also eine Zahl erhöhen und wann nicht?
        Ist so eine Lücke in der Folge schon Kriterium für den kompletten Abbruch?
        Gibts auch Kommazahlen die dann nicht mehr als natürliche Zahlen gelten?

  2. Ich will Zahlen jeweils um eins erhöhen, wenn eine bestimmte Bedingung erfüllt ist.
    Die Zahlen sind als Eigenschaften von Objekten gespeichert und zeigen als Tooltip die Nummer von Objekten an. Sie sind sozusagen der Bezeichner des Objekts. Da man die Objekte in beliebiger Reihenfolge entfernen und einfügen kann, ist es auch möglich, dass die Zahlenreihe so aussieht:

    Ausgangsbeispiel:

    1, 3, 5, 6

    Man kann jetzt u.a. in die Zwischenräume neue Objekte einfügen, wodurch sich gegebenenfalls die nachfolgenden Nummern ändern sollen. Wenn man z.B. zwischen 1 und 3 ein neues Objekt einfügt, sollen die Nummern so aussehen:

    1, 2, 3, 5, 6  (Ausgangsbeispiel geändert: 2 eingefügt, keine Änderung der Nummern nach 2)

    Wenn man z.B. zwischen 5 und 6 ein neues Objekt einfügt, erhält das neue Objekt die Nummer 6 und die Nummer des nachfolgenden Objets (die vorige 6) muss um eins erhöht werden (weil keine Nummer zwei Mal vorkommen darf):

    1, 3, 5, 6, 7  (Ausgangsbeispiel geändert: 6 eingefügt, ursprüngliche Nummer 6 um eins erhöht)

    Allgemein: Wenn die Nummer des nachfolgenden Objekts um eins größer ist als die vorige Nummer, muss die nachfolgende Nummer (um eins) erhöht werden, wenn dazwischen ein Objekt eingefügt wird. Wenn das nicht der Fall ist, muss keine der vorhandenen Nummern geändert werden.

    Ohje, ich sehe schon, dass sich das sehr kompliziert anhört. Ist es aber eigentlich nicht. Kompliziert ist (nach mehreren erfolglosen Versuchen meinerseits) vermutlich nur die Realisierung.

    1. [latex]Mae  govannen![/latex]

      Allgemein: Wenn die Nummer des nachfolgenden Objekts um eins größer ist als die vorige Nummer, muss die nachfolgende Nummer (um eins) erhöht werden, wenn dazwischen ein Objekt eingefügt wird. Wenn das nicht der Fall ist, muss keine der vorhandenen Nummern geändert werden.

      Du hast da einen Denkfehler: Wenn die Nummer des nachfolgenden Objekts um eins größer ist als die vorige Nummer, müssen die Werte _aller_ Objekte mit höherer Nummer um eins erhöht werden, und zwar solange, bis eine Lücke auftritt. Ansonsten verschiebst du die Doppelung nur eins weiter.

      Ich sehe das Ganze wegen der daraus resultierenden Komplexität allerdings als problematischen bis fehlerhaftes Konzept. Du solltest ernsthaft überdenken, ob es keine andere, einfachere Methode gibt, beispielsweise die Objekte einfach stur weiter zu numerieren (höchster_bisher_vergebener_wert + 1); eventuell ergänzt durch Auffüllen unbesetzter Werte.

      In keinem Fall würde ich aber die vorhandenen Eigenschaften mehr ändern.

      Stur lächeln und winken, Männer!
      Kai

      --
      „Die Borg würden nicht mal Spaß verstehen, wenn sie einen Vergnügungspark assimiliert hätten!” (B'Elanna Torres)
      SelfHTML-Forum-Stylesheet
      1. [latex]Mae  govannen![/latex]

        Du hast da einen Denkfehler: Wenn die Nummer des nachfolgenden Objekts um eins größer ist als die vorige Nummer, müssen die Werte _aller_ Objekte mit höherer Nummer um eins erhöht werden, und zwar solange, bis eine Lücke auftritt. Ansonsten verschiebst du die Doppelung nur eins weiter.

        Das ist richtig. Ich wollte halt keinen allzu langen Roman schreiben.

        Wenn die Reihe z. B. so aussieht:

        1, 2, 3, 4, 5

        Und zwischen 1 und 2 wird ein neues Objekt eingefügt, dann sieht danach die Reihe so aus:

        1, 2, 3, 4, 5, 6  (2 wurde neu eingefügt, alle Nummern nach 2 wurden um eins erhöht.)

        Das ist aber eine leichte Sache, bei der keine Schwierigkeiten auftauchen. Das (also die Erhöhung aller nachfolgenden Objekte um eins kann man natürlich in jedem Fall machen, ist aber in meinem früheren Beispiel wenig intuitiv, weil dort Objekt-Nummern geändert werden, ohne das es notwendig ist. Wenn ich davon ausgehe, dass mit den Objekten tatsächlich gearbeitet wird, kann sich der eine oder andere an die Nummer eines Objekts erinnern - und plätzlich - nach Einfügung eines weiteren Objekts - hat es eine andere Nummer, ohne dass man es erwartet.

        Während die Änderung der Nummern im Beispiel oben zwangsläufig jeder erwartet, weil es - um die eindeutige Bezeichnung aufrechtzuerhalten - es gar nicht anders möglich ist.

    2. Hallo!

      Ich verfolge den Thread jetzt schon von Anfang an, aber ich habe immer noch nicht verstanden, was du jetzt eigentlich beabsichtigst, bzw. wieso weshalb warum! ;-)

      Allgemein: Wenn die Nummer des nachfolgenden Objekts um eins größer ist als die vorige Nummer, muss die nachfolgende Nummer (um eins) erhöht werden, wenn dazwischen ein Objekt eingefügt wird. Wenn das nicht der Fall ist, muss keine der vorhandenen Nummern geändert werden.

      Ohje, ich sehe schon, dass sich das sehr kompliziert anhört. Ist es aber eigentlich nicht. Kompliziert ist (nach mehreren erfolglosen Versuchen meinerseits) vermutlich nur die Realisierung.

      Nein, vermutlich hört es sich nur so kompliziert an, weil du immer noch nicht den eigentlichen Anwendungsfall beschrieben hast, sondern nur umständlich versuchst_deinen_Lösungsansatz zu erläutern.

      Soweit ich das bis jetzt verstanden zu haben glaube, würde ich sagen, dass du doch einfach nach jedem Lösch-, Einfüge- oder Verschiebevorgang einfach deine "Objekte" von 1 beginnend einfach nur neu durchnummerieren musst. Und wenn die Objekt-Nr. von Bedeutung ist, dann ordne jedem Objekt noch seine jeweils (aktuelle) Platz-Nr. zu.

      Gruß Gunther

    3. @@Zerp-Wisser:

      nuqneH

      Ich will Zahlen jeweils um eins erhöhen, wenn eine bestimmte Bedingung erfüllt ist.

      Nein, ich glaub nicht, dass du das willst.

      Du willst eine Ordnung in deinen Objekten. Deine Objekte sollten also nicht einfach so nebeneinander umherschwirren, sondern in einer Liste stehen, sprich einem Array. Dann kannst du Objekte darin <http://de.selfhtml.org/javascript/objekte/array.htm#splice@title=löschen und welche an gewünschten Positionen einfügen>. Und du hast deine Objekte stets in der gewünschten Reihenfolge.

      Die Zahlen sind als Eigenschaften von Objekten gespeichert und zeigen als Tooltip die Nummer von Objekten an. Sie sind sozusagen der Bezeichner des Objekts.

      ?? Ein Bezeichner sollte sich nicht ändern, wenn neue Objekte hinzukommen. Wozu genau brauchst du die Zahlen?

      Qapla'

      --
      „Perfektion ist nicht dann erreicht, wenn es nichts mehr hinzuzufügen gibt, sondern wenn man nichts mehr weglassen kann.“ (Antoine de Saint-Exupéry)
      1. @@Zerp-Wisser:

        nuqneH

        Ich will Zahlen jeweils um eins erhöhen, wenn eine bestimmte Bedingung erfüllt ist.

        Nein, ich glaub nicht, dass du das willst.

        Tja, für einige ist es anscheinend üblich, dem Fragenden vorzuschreiben, was er zu wollen hat. Das geht sehr einfach: Wenn die Antwort auf die Frage zu komplex erscheint, muss man einfach etwas Simples wollen.

        Zurück zum Problem: Es ist ein ganz einfaches, rein mathematisches Problem. Und wenn man es verstanden hat, lässt es sich auch sehr einfach lösen: Mit nur einer einzigen Bedingung. :-)