为了账号安全,请及时绑定邮箱和手机立即绑定

在 JavaScript 中排序罗马数字

在 JavaScript 中排序罗马数字

狐的传说 2023-11-12 15:34:18
我在 javascript 中有一个函数,其中它schoolClass是一个像这样的罗马数字I,等等II。IV这个函数被多次调用,结果它连接在一个数组中,如下所示:const generateClasses = (schoolClass, number) => {  const classes = [];  for (let i = 0; i < number; i++) {    classes.push(`${schoolClass}-${(i + 10).toString(36).toUpperCase()}`);  }  return classes;};let output = [];output = output.concat(generateClasses('II', 2));output = output.concat(generateClasses('I', 1));output = output.concat(generateClasses('IV', 2));console.log(output);最后输出是这样的:["II-A", "II-B", "I-A", "IV-A", "IV-B"]如何像数组一样排序["I-A", "II-A", "II-B", "IV-A", "IV-V"] 我感谢任何帮助!PS:为了转换罗马数字,我使用该roman-numbers模块
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

您需要将罗马数字转换为普通(阿拉伯)数字进行比较。由于罗马数字的数量非常有限,最简单的方法就是对它们进行硬编码 - 如果您只有 12 个不同的可能输入,则无需涉及转换它们的算法。

使用IXII的硬编码值,您可以通过拆分字符串并根据多个条件进行排序-

  • 按破折号之前的部分作为数字排序。

  • 破折号后面的部分作为字符串。

const romanTable = {

  "I"   : 1,

  "II"  : 2,

  "III" : 3,

  "IV"  : 4,

  "V"   : 5,

  "VI"  : 6,

  "VII" : 7,

  "VIII": 8,

  "IX"  : 9,

  "X"   : 10,

  "XI"  : 11,

  "XII" : 12,

};


const arr = ["II-A", "II-B", "I-A", "IV-A", "IV-B"];


arr.sort((a, b) => {

  const [mainA, secondaryA] = a.split("-");

  const [mainB, secondaryB] = b.split("-");

  

  if (mainA !== mainB)

    return romanTable[mainA] - romanTable[mainB];

   

  return secondaryA.localeCompare(secondaryB);

});


console.log(arr);


查看完整回答
反对 回复 2023-11-12
?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

由于学校成绩仅限于 12 名,因此按字母顺序排序并不是那么糟糕。对于您给出的示例,您可以只调用.sort()该数组就可以了。


实际上,只有“IX”会被排序在错误的位置。那么让我们来处理这个问题:


let classes = ["XII-A", "IX-A", "VII-A", "II-A", "II-B", "I-A", "IV-A", "IV-B"];

let trans = s => s.replace("IX", "VIIJ");

classes.sort((a, b) => trans(a).localeCompare(trans(b)));

console.log(classes);


查看完整回答
反对 回复 2023-11-12
?
MM们

TA贡献1886条经验 获得超2个赞

这里我通过迭代每个罗马字符将罗马字符转换为整数,所以 XII 将是 (10+1+1)


现在对它们进行排序,但如果 2 个罗马字符相同,我会比较其附带的字母表。


const num = ["II-B", "II-A", "I-A", "IV-A", "IV-B"];


num.sort((a, b) => {

  const diff = roman_to_Int(a.split("-")[0]) - roman_to_Int(b.split('-')[0]);

  if (diff === 0) {

    return a.split("-")[1].localeCompare(b.split("-")[1]);

  }

  return diff;


});


console.log(num);


/* Source - https://www.w3resource.com/javascript-exercises/javascript-math-exercise-22.php */


function roman_to_Int(str1) {

  if(str1 == null) return -1;

  var num = char_to_int(str1.charAt(0));

  var pre, curr;

  for(var i = 1; i < str1.length; i++){

    curr = char_to_int(str1.charAt(i));

    pre = char_to_int(str1.charAt(i-1));

    if(curr <= pre){

      num += curr;

    } else {

      num = num - pre*2 + curr;

    }

  }

  return num;

}


function char_to_int(c){

    switch (c){

      case 'I': return 1;

      case 'V': return 5;

      case 'X': return 10;

      case 'L': return 50;

      case 'C': return 100;

      case 'D': return 500;

      case 'M': return 1000;

      default: return -1;

    }

}



查看完整回答
反对 回复 2023-11-12
  • 3 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信