Gewusst wie: konvertieren der Sequenz von zahlen in einem array in range von zahlen
In javascript, wie zum konvertieren der Sequenz von zahlen in einem array in range von zahlen?
zB. [2,3,4,5,10,18,19,20]
zu [2-5,10,18-20]
- Wie sind Sie zu bestimmen, wo ein Bereich beginnt und endet?
- Bearbeitet ich Ihre Frage (Beispiel entfernt, vom Titel, formatiert Körper). Sie können Menschen motivieren zu helfen, formatieren Sie Ihre Frage richtig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Algorithmus, den ich gemacht vor einiger Zeit, die ursprünglich für C#, jetzt habe ich portiert JavaScript:
Einfach nur Spaß mit der Lösung von CMS :
function getRanges(c){for(var b=[],a,d=0;d<c.length;)b.push((a=c[d])+(function(b){for(;++a===c[++d];);return--a===b}(a)?"":"-"+a));return b};
(google closure compiler)Ich war gerade auf der Suche nach genau diesem Ding. Ich brauchte eine PHP-version portiert CMS-Lösung. Hier ist es, wer Stoppt diese Frage auf der Suche für die gleiche Sache:
Ich fand diese Antwort hilfreich, sondern benötigt ein Python-version:
Sehr schöne Frage: hier ist mein Versuch:
Demo auf JSFiddler
Wenn Sie wollen einfach nur ein string für einen Bereich, dann würden Sie finden den mid-point der Sequenz, und das wird Ihr mittlerer Wert (10 in deinem Beispiel). Sie würden dann schnappen Sie sich das erste Element in der Sequenz, und die Artikel, die unmittelbar vor Ihrer Mitte, und bauen Sie Ihr erste-Sequenz-Darstellung. Würden Sie das gleiche Verfahren, um Ihren letzten Element, und das Element folgt unmittelbar auf Ihre Mitte, und bauen Sie Ihre Letzte-Folge-Darstellung.
Demo Online: http://jsbin.com/uvahi/edit
Hier ist eine version für Perl:
Hier ist mein nehmen auf diese...
In C#
Hier ist ein port des CMS-code für die BASH:
Konnte man Durchlaufen Sie die zahlen und sehen, ob die nächste Zahl 1 ist größer als die aktuelle Anzahl. Also:
wo, wenn
array[i+1] == array[i]+1;
(wobei ich auch die aktuell beobachtete Zahl)dann
range.end = array[i+1];
. Dann werden Sie auf den nächsten Fortschritti
; Wennarray[i+1] != array[i]+1;
dannrange.end = array[i];
könnten Sie speichern die Bereiche in einem
vector< range > ranges;
Druck wäre einfach:
Sowas.
PHP
Ich geschrieben habe meine eigene Methode, die abhängig von Lo-Dash, aber nicht nur Ihnen wieder eine Reihe von Bereichen, sondern, es nur gibt ein array von reichen Gruppen.
[1,2,3,4,6,8,10] wird zu:
http://jsfiddle.net/mberkom/ufVey/
Ist eine Anpassung der CMS javascript-Lösung für Kalte Fusion
Es tut, Sortieren Sie die Liste zunächst so, dass
1,3,2,4,5,8,9,10
(oder ähnlich) richtig konvertiert1-5,8-10
.Hier ist, was ich zusammen gestellt habe in Swift. Es entfernt Duplikate und sortiert das array zuerst, und hat nichts dagegen, wenn es angegeben wurde, wird ein leeres array oder ein array ein.
Winzigen ES6-Modul für Euch. Es übernimmt eine Funktion, um zu bestimmen, Wann müssen wir brechen die Sequenz (breakDetectorFunc param - Standard ist die einfache Sache, für integer-Sequenz-Eingang).
HINWEIS: da input ist Abstrakt - es gibt keine automatische Sortierung vor Verarbeitung, so, wenn Ihre Reihenfolge ist nicht sortiert - tun Sie vor dem aufrufen dieses Modul
erste argument ist die Eingangs-Reihenfolge sortiert-array, der zweite ist ein Boolesches flag zum Steuern des Ausgangs-Modus: wenn true - single Element (außerhalb der Intervalle) zurückgegeben werden als arrays sowieso: [1,7],[9,9],[10,10],[12,20], ansonsten einzelne Gegenstände zurück, wie Sie in der Eingabe-array
Ihre Probe-Eingang
zurück:
Verwendung von ES6, eine Lösung ist:
Wenn Sie möchten, fügen Sie zusätzliche Leerzeichen für die Lesbarkeit, fügen Sie einfach zusätzliche Aufrufe
string.prototype.replace()
.Wenn der input Vektor ist nicht sortiert sind, können Sie fügen Sie die folgende Zeile direkt hinter die öffnende Klammer der
display()
Funktion:vector.sort ( ( a, b ) => a - b ); //sort vector in place, in increasing order
.Beachten Sie, dass diese verbessert werden könnten, zu vermeiden, testen zweimal für integer adjacentness (adjacenthood? Ich bin kein Englisch-Muttersprachler;-).
Und natürlich, wenn Sie nicht wollen, eine einzelne Zeichenfolge als Ausgang, teilen Sie es mit einem ";".
Brauchte ich eine PHP-version, die unterstützt auch nach unten reicht (z.B.
[10,9,8]
wird umgewandelt zu[10-8]
). So habe ich geändert DisgruntledGoat version, die portiert CMS-Lösung. Es kann auch mit Zeichenketten in der Eingabe richtig.Beispiel:
Brauchte ich Typoskript-code heute zu lösen dieses problem-viele Jahre nach der OP -- und beschlossen, zu versuchen, eine version geschrieben, in einem Stil, der eher funktional als die anderen Antworten hier. Natürlich, nur die parameter und den Rückgabetyp Anmerkungen unterscheiden Sie diesen code standard ES6 JavaScript.
Beachten Sie, dass
slice
ist notwendig, weilsort
sortiert an Ort und Stelle und wir können nicht ändern, das ursprüngliche array.