当前位置: 首页 > 面试题库 >

排序数组元素(带数字的字符串),自然排序

易弘亮
2023-03-14
问题内容

我有一个数组

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

并且需要对其进行排序,使其看起来像;

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

我尝试了排序功能;

function compare(a,b) {
  if (a < b)
     return -1;
  if (a > b)
    return 1;
  return 0;
}

但这给出了命令

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

我试图考虑一个正则表达式可以正常工作,但无法解决这个问题。
如果有帮助,格式将始终为2个字母,x个数字,然后是任意数量的字符。


问题答案:

这称为“自然排序”,可以像这样在JS中实现:

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;

}



/////////////////////////



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));

要以相反的顺序排序,只需交换参数即可:

test.sort(function(a, b) { return naturalCompare(b, a) })

或简单地

test = test.sort(naturalCompare).reverse();


 类似资料:
  • 我有一个程序,它接受一个单词和一个文本文件字典,并在字典中搜索与给定单词相等的单词组合(是字母表)。 我最后得到了一个字符串数组的Arraylist,每个数组都是一个包含它所使用的单词的解决方案,Arraylist是所有的解决方案。 它首先按字长(降序)排序,然后对等长字使用字母排序。 我现在对各个数组进行了排序,但我正试图按照某些规则在arraylist中对它们进行排序: 按字数递增 对于包含相

  • 在我看来最好的情况应该是O(log n),但不确定最坏的情况...也许O(n^2)一次只能匹配一个字母。 谁能给我更多的点子吗?

  • 问题内容: 我有一个包含数字的字符串列表,但找不到找到对它们进行排序的好方法。 例如,我得到这样的东西: 用的方法。 我知道我可能需要以某种方式提取数字,然后对列表进行排序,但是我不知道如何以最简单的方式进行操作。 问题答案: 也许您正在寻找人工排序(也称为自然排序): 产量 PS。我已经更改了答案,以使用Toothy的自然排序实现(在此处发表评论),因为它比我的原始答案快得多。 如果您希望使用浮

  • 我正在玩排序数组,我弄清楚了如何对int数组进行合并排序。但是我不知道合并字符串数组。在正常排序时,对字符串数组进行排序很容易,但合并排序不同。我到目前为止所做的代码如下,正在处理int数组。

  • 我试图计算每个字符串中的元音,我想根据count变量交换字符串,但我做不到。在接受字符串后,我用toCharArray()函数将其转换为char数组,并将每个字符与小写和大写元音进行比较。 我收到一个错误。编写代码部分的任何帮助都将不胜感激。 输入: 输出:

  • 我有一个数组: 如何根据数组中每个元素中包含的数字对数组进行排序?