"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como classificar matrizes com strings contendo números em ordem natural?

Como classificar matrizes com strings contendo números em ordem natural?

Publicado em 23/12/2024
Navegar:410

How to Sort Arrays with Strings Containing Numbers in Natural Order?

Classificação de elementos de array natural: strings com números

Este artigo se aprofunda na tarefa de classificar arrays contendo elementos que combinam strings e números em um ordem natural, onde as sequências numéricas dentro das strings devem ser consideradas no processo de classificação.

O Problema

Considere um array como este:

["IL0 Foo", "PI0 Bar", "IL10 Baz", "IL3 Bob says hello"]

Se tentarmos classificar esse array usando uma função de classificação convencional, podemos acabar com uma ordem incorreta:

["IL0 Foo", "IL10 Baz", "IL3 Bob says hello", "PI0 Bar"]

A solução: classificação natural

Para obter uma classificação natural, podemos aproveitar a seguinte função JavaScript:

function naturalCompare(a, b) {
    var ax = [], bx = [];

    a.replace(/(\d )|(\D )/g, function(_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) });
    b.replace(/(\d )|(\D )/g, function(_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });
    
    while(ax.length && bx.length) {
        var an = ax.shift();
        var bn = bx.shift();
        var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
        if(nn) return nn;
    }

    return ax.length - bx.length;
}

Esta função tokeniza as strings de entrada em matrizes de valores numéricos e não numéricos. Em seguida, ele compara os arrays lexicograficamente, levando em consideração os valores numéricos como inteiros e os valores não numéricos como strings.

Exemplo

Aplicando esta função ao array fornecido resulta na ordem de classificação natural desejada:

test = [
    "img12.png",
    "img10.png",
    "img2.png",
    "img1.png",
    "img101.png",
    "img101a.png",
    "abc10.jpg",
    "abc10",
    "abc2.jpg",
    "20.jpg",
    "20",
    "abc",
    "abc2",
    ""
];

test.sort(naturalCompare)
document.write("<pre>"   JSON.stringify(test,0,3));

Isso produz a seguinte matriz classificada:

[
  "",
  "abc",
  "abc2",
  "abc10",
  "abc10.jpg",
  "20",
  "20.jpg",
  "img1.png",
  "img2.png",
  "img10.png",
  "img12.png",
  "img101.png",
  "img101a.png"
]
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3