Bir dizi, her öğenin uzunluğuna göre nasıl sıralanır?


99

Bunun gibi bir dizim var:

arr = []
arr[0] = "ab"
arr[1] = "abcdefgh"
arr[2] = "abcd"

Sıralamadan sonra çıktı dizisi şöyle olmalıdır:

arr[0] = "abcdefgh"
arr[1] = "abcd"
arr[2] = "ab"  

Demek istediğim, her bir elemanın uzunluğunun azalan sırasını istiyorum.


1
sortoldukça basit, nerede zorluk yaşıyorsunuz?
mu çok kısa

5
@muistooshort well default sort () dizeleri alfabetik olarak sıralar, seçilen cevapta görülebileceği gibi string.length sıralamasını arıyordu :)
jave.web

Yanıtlar:


239

Array.sortDiziyi sıralamak için yöntemi kullanabilirsiniz . Dizinin uzunluğunu sıralama ölçütü olarak kabul eden bir sıralama işlevi aşağıdaki gibi kullanılabilir:

arr.sort(function(a, b){
  // ASC  -> a.length - b.length
  // DESC -> b.length - a.length
  return b.length - a.length;
});

Not: ["a", "b", "c"]Dizenin uzunluğuna göre sıralamanın döndürülmesi garanti edilmez ["a", "b", "c"]. Göre özellikleri :

Sıralama sabit olmak zorunda değildir (yani, eşitliği karşılaştıran öğeler mutlaka orijinal sıralarında kalmaz).

Amaç uzunluğa göre sıralamaksa, sözlük sırasına göre ek kriterler belirtmelisiniz:

["c", "a", "b"].sort(function(a, b) {
  return a.length - b.length || // sort by length, if equal then
         a.localeCompare(b);    // sort by dictionary order
});

Bunun diziyi öğelerin uzunluğunu azaltarak sıraladığını ekleyeceğim.
davidhq

aha bu yorumda :) ilk başta
görmedim

Sadece bir bilgi eklemek için. Bu pasaj tüm durumlarda çalışmayacaktır.
Arunkumar Srisailapathi

Arr = ['a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'k', 'l'] için deneyin, başarısız olacak
Arunkumar Srisailapathi

16
ES6 yoluarr.sort((a, b) => b.length - a.length)
Fergal

5

Bu diziyi sıralamak için Array.sort yöntemini kullanabiliriz .

ES5 çözümü

var array = ["ab", "abcdefgh", "abcd"];

array.sort(function(a, b){return b.length - a.length});

console.log(JSON.stringify(array, null, '\t'));

İçin artan sıralama düzeninde:a.length - b.length

İçin azalan sıralama düzeni:b.length - a.length

ES6 çözümü

Dikkat: tüm tarayıcılar ES6 kodunu anlayamaz!

ES6'da bir ok işlevi ifadesi kullanabiliriz .

let array = ["ab", "abcdefgh", "abcd"];

array.sort((a, b) => b.length - a.length);

console.log(JSON.stringify(array, null, '\t'));



0

Salman'ın cevabına dayanarak, onu özetlemek için küçük bir fonksiyon yazdım:

function sortArrayByLength(arr, ascYN) {
        arr.sort(function (a, b) {           // sort array by length of text
            if (ascYN) return a.length - b.length;              // ASC -> a - b
            else return b.length - a.length;                    // DESC -> b - a
        });
    }

o zaman sadece onunla ara

sortArrayByLength( myArray, true );

Maalesef, bu sayfada açıklandığı gibi işlevlerin Dizi prototipine eklenemeyeceğini / eklenmemesi gerektiğini unutmayın .

Ayrıca, parametre olarak aktarılan diziyi değiştirir ve hiçbir şey döndürmez. Bu, dizinin kopyalanmasını zorlar ve büyük diziler için harika olmaz. Birinin daha iyi bir fikri varsa, lütfen yorum yapın!


0

@ Shareef'in cevabını kısa olması için uyarladım. Kullanırım,

.sort(function(arg1, arg2) { return arg1.length - arg2.length })


bu, düşük uzunluktan daha yüksek uzunluğa doğru sıralanır
Miguel

0
#created a sorting function to sort by length of elements of list
def sort_len(a):
    num = len(a)
    d = {}
    i = 0
    while i<num:
        d[i] = len(a[i])
        i += 1
    b = list(d.values())
    b.sort()
    c = []
    for i in b:
        for j in range(num):
            if j in list(d.keys()):
                if d[j] == i:
                    c.append(a[j])
                    d.pop(j)
    return c

1
Kodu göndermek tek başına yardımcı olmaz. Kodunuzun ne yaptığına dair kısa bir açıklama yapın.
coderpc

0

Orijinal diziyle aynı uzunluktaki öğenin sırasını korumak istiyorsanız, balon sıralaması kullanın.

Input = ["ab","cdc","abcd","de"];

Output  = ["ab","cd","cdc","abcd"]

İşlev:

function bubbleSort(strArray){
  const arrayLength = Object.keys(strArray).length;
    var swapp;
    var newLen = arrayLength-1;
    var sortedStrArrByLenght=strArray;
    do {
        swapp = false;
        for (var i=0; i < newLen; i++)
        {
            if (sortedStrArrByLenght[i].length > sortedStrArrByLenght[i+1].length)
            {
               var temp = sortedStrArrByLenght[i];
               sortedStrArrByLenght[i] = sortedStrArrByLenght[i+1];
               sortedStrArrByLenght[i+1] = temp;
               swapp = true;
            }
        }
        newLen--;
    } while (swap);
  return sortedStrArrByLenght;
}

-1

Bu kod hile yapmalı:

var array = ["ab", "abcdefgh", "abcd"];

array.sort(function(a, b){return b.length - a.length});

console.log(JSON.stringify(array, null, '\t'));

-3
<script>
         arr = []
         arr[0] = "ab"
         arr[1] = "abcdefgh"
         arr[2] = "sdfds"
         arr.sort(function(a,b){
            return a.length<b.length
         })
         document.write(arr)

</script>

Sıralamak için ilettiğiniz anonim işlev, verilen diziyi nasıl sıralayacağını söyler. Umarım bu yardımcı olur. ne yapmalı


5
Döndürmesi gereken sıralama karşılaştırma işlevi nedir? İşte bir ipucu: bu bir boole değil.
mu çok kısa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.