2016-05-03 13 views
1

Ich habe Code geschrieben, um die n-längste Zeichenfolge in einem Array von Strings zu bestimmen. Im Folgenden habe ich Testfälle aufgelistet, die in der Codewars-Kata aufgeführt sind.nth Längste String Sortierung

Anweisungen: Implementieren Sie die Funktion am längsten (Array, n), wo Sie ein Array von Strings erhalten und dann die n-te längste Zeichenfolge in diesem Array zurückgeben. z.B. arr = ['Hallo', 'Welt', 'Codewars', 'Katas'] n = 3; sollte 'Welt' zurückgeben, weil 'Codewars' Länge = 8, 'Hallo' Länge = 5, also das zweitlängste Wort und dann 'Welt' (obwohl auch Wortlänge von 5, 'Welt' nach 'Hallo' in der Array). Wenn Wörter die gleiche Länge haben, behandeln Sie sie in der Reihenfolge, in der sie im Array vorhanden sind. Array wird niemals leer sein und n> 0 immer.

Test.assertEquals(longest(['Hello','World','Codewars','Katas'],3),'World'); 
Test.assertEquals(longest(['Hello','World','Codewars','Katas'],4),'Katas'); 
Test.assertEquals(longest(['aa', 'bb', 'cc', 'dd', 'eee', 'b', 'f', 'ff', 'hhh', 'gggg'],4),'aa'); 
Test.assertEquals(longest(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k'],1),'a'); 
Test.assertEquals(longest(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k','l'],1),'a'); 

Ich habe alle der codewars Testfälle mit Ausnahme der letzten mit der Anordnung der Endung ‚l‘ übergeben. Meine Codezeile für die Sortierung scheint das "f" an der nullten Stelle für diesen Testfall zu platzieren und ich verstehe nicht warum.

function longest(arr, n) { 
    arrLength = []; 
    arr.sort(function(a, b){return b.length - a.length}); 
    console.log(arr); 
    arr.forEach(function(numArray){ 
    return arrLength.push(numArray.length); 
    }); 
    return arr[n-1]; 
} 

console.log(longest(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k'],1)); 
// Sorted Array: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "k"] 
// returns a 
console.log(longest(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k', 'l'],1)); 
// Sorted Array: ["f", "a", "c", "d", "e", "b", "g", "h", "i", "k", "l"] 
// returns f 

Ich kann nicht scheinen, warum meine Sortierfunktion, um herauszufinden, „f“ in der nullten Position bringt, wenn die ‚l‘ bis zum Ende des String-Array hinzugefügt wird.

+0

Ihre Sortierfunktion misst die Länge. Warum sollten Sie eine bestimmte Bestellung erwarten, wenn alle Artikel gleich lang sind? – bhspencer

+0

Vielen Dank für Ihre Hilfe. Ich schätze wirklich Ihren Beitrag zu meiner Frage ... –

Antwort

0

Sie verwenden die integrierte Sortierfunktion, vielleicht diese Funktion ändern Sie den Algorithmus der Sortierung abhängig von Ihrem Array am Ende nicht das gleiche Verhalten mit gleicher Länge Strings. Und vielleicht ist das auch Browser abhängig.

Ich empfehle Ihnen, dies zu ändern, indem Sie eine Bibliothek mit einer bestimmten Sortierfunktion (Quicksort, was auch immer ...) verwenden. Und prüfen Sie, ob das wieder passiert.

+0

Dies sollte ein Kommentar sein, keine Antwort. – bhspencer

+1

@bhspencer Dies ist eine Antwort: Verwenden Sie etwas anderes als die native Sortierfunktion. – Walfrat

1

Funktioniert gut auf MSIE.

Ein schneller Test auf Microsoft Internet Explorer (alle Versionen) gibt die folgenden Ergebnisse für die Funktion, die Sie zur Verfügung gestellt:

>> longest(['a','b','c','d','e','f','g','h','i','k'],1); 
a,b,c,d,e,f,g,h,i,k 
"a" 
>> console.log(longest(['a','b','c','d','e','f','g','h','i','k','l'],1)); 
a,b,c,d,e,f,g,h,i,k,l 
a 
>> console.log(longest(['a','b','c','d','e','f','g','h','i','k','l',"m","n"],1)); 
a,b,c,d,e,f,g,h,i,k,l,m,n 
a 

ps: Alle nicht MS-Browser haben Probleme mit der Stabilität von sort().

+0

Ja, ich verwende Chrom. Wie Sie sagten, sieht es so aus, dass sort() von Browser zu Browser variiert. –