亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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條經驗 獲得超3個贊

由于學校成績僅限于 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 關注
  • 224 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號