使用函数按字母顺序对字符串进行排序

63

假设你得到了一个字符串,需要使用函数按字母顺序对该字符串进行排序。例如:

sortAlphabets( 'drpoklj' ); //=> returns 'djklopr'

怎样才是最好的做法?


5
我尝试过了,但是我找不到我想要的东西。这个答案只是增加了我的经验。 - Marco V
3个回答

113

您可以使用数组sort函数:

var sortAlphabets = function(text) {
    return text.split('').sort().join('');
};

步骤

  1. string 转换为 array
  2. array 进行排序
  3. 将排序后的 array 再次转换为 string

演示


10
这个解决方案的时间和空间复杂度是多少? - kdizzle
1
@kdizzle 每个方法本身都是O(N)... - GiselleMtnezS
7
时间复杂度:排序为O(N logN),拆分和连接为O(N),因此时间复杂度为O(N logN)。空间复杂度为O(N)。 - Xitang

37
较新的浏览器支持 String.prototype.localeCompare() 方法,使得排序使用 utf8 编码字符串变得非常简单。需要注意的是,不同语言的字符排序可能不同。更多关于 localCompare 的信息,请参见 MDN。

function sortAlphabet(str) {
  return [...str].sort((a, b) => a.localeCompare(b)).join("");
}

console.log(sortAlphabet("drpoklj")); // Logs: "djklopr"

如果您只需要支持ASCII字符串,则默认的排序实现即可。

function sortAlphabet(str) {
  return [...str].sort().join("");
}

请注意,返回的值是一个数组,而应该是一个字符串,因此需要添加.join("") - yl2015
1
@yl2015 很好的发现!我已经相应地更新了答案。 - marvinhagemeister

20

正如之前的答案所示,您需要将字符串转换为单个字符的数组,对其进行排序,然后重新组合成字符串。 但是,使用 split 不是执行第一步的最佳实践方法,因为JavaScript字符串是一系列带有无效代理对的UTF-16代码单元, split("")将代理对拆分成它们的单独代码单元,可能会将它们分开,从而破坏它们应该作为一对形成的代码(宽松地说:字符)。因此,如果字符串中有表情符号(例如)或任何数以万计的非西方脚本中的字符,这些字符可能会被破坏。

在ES5及更早版本中,正确拆分字符串需要检测和处理代理对,以确保它们保持在一起,这有点麻烦,并涉及检查 charCodeAt 以特定值范围。

从ES2015+开始,这非常容易:您只需使用字符串的迭代器,该迭代器定义为提供字符串中的每个代码,无论是单个代码单元还是两个代码单元。要获取代码点数组,可以通过扩展符号使用迭代器( [...str])或 Array.from Array.from(str))。

因此,使用它,我们得到:

function sortAlphabets(str) {
    return [...str].sort((a, b) => a.localeCompare(b)).join("");
}

实时示例:

// Using the iterator
function sortAlphabets(str) {
    return [...str].sort((a, b) => a.localeCompare(b)).join("");
}

// Using split("")
function sortAlphabetsUsingSplit(str) {
    return str.split("").sort((a, b) => a.localeCompare(b)).join("");
}

const str = "देवनागरी";
console.log("Original string    : " + str);
console.log("Using the iterator : " + sortAlphabets(str));
console.log("Using split('')    : " + sortAlphabetsUsingSplit(str));

请注意,使用split会导致某些字符变形。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接