3 回答
TA贡献1820条经验 获得超2个赞
您需要将罗马数字转换为普通(阿拉伯)数字进行比较。由于罗马数字的数量非常有限,最简单的方法就是对它们进行硬编码 - 如果您只有 12 个不同的可能输入,则无需涉及转换它们的算法。
使用I到XII的硬编码值,您可以通过拆分字符串并根据多个条件进行排序-
:
按破折号之前的部分作为数字排序。
破折号后面的部分作为字符串。
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);
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);
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;
}
}
添加回答
举报