按字母顺序比较 2 个字符串以进行排序

Posted

技术标签:

【中文标题】按字母顺序比较 2 个字符串以进行排序【英文标题】:comparing 2 strings alphabetically for sorting purposes 【发布时间】:2012-04-29 04:58:39 【问题描述】:

我正在尝试。例如,我想要一个像if('aaaa' < 'ab') 这样的布尔检查。我试过了,但它没有给我正确的结果,所以我猜这不是正确的语法。我如何在 jquery 或 javascript 中做到这一点?

【问题讨论】:

你见过***.com/questions/1134976/…吗? 您就是这样做的。你期待什么结果?表达式'aaaa' < 'ab' 返回true 【参考方案1】:

您确实说比较是为了排序。然后我建议改为localeCompare:

"a".localeCompare("b");

它返回-1,因为"a" < "b"10 否则,就像你需要Array.prototype.sort() 一样

请记住,排序取决于区域设置。例如。在德语中,äa 的变体,所以"ä".localeCompare("b", "de-DE") 返回-1。在瑞典语中,ä 是字母表中的最后一个字母,因此"ä".localeCompare("b", "se-SE") 返回1

如果没有localeCompare 的第二个参数,则使用浏览器的区域设置。根据我的经验,这绝不是我想要的,因为那样它的排序方式就会与服务器不同,服务器对所有用户都有固定的语言环境。

此外,如果您要排序的内容包含数字,您可能需要:

"a5b".localeCompare("a21b", undefined,  numeric: true )

这将返回 -1,将 5 视为小于 21 的数字。如果没有 numeric: true ,它将返回 1,因为“2”排在“5”之前。在许多实际应用中,用户期望“a5b”出现在“a21b”之前。

【讨论】:

+1 还值得一提的是,这也适用于案例("aa".localeCompare("ab") == "aa".localeCompare("Ab") 对于我能想到的任何语言环境),即使在旧版本中也可以使用的IE。应该是公认的答案! +1 给彼得;这与 Javascript 数组排序的工作方式更兼容,因此它更有用,我认为这更多的是 OP 所要求的。 我想,这应该是正确的答案。进行字母(非 Unicode)字符串比较的唯一方法。 这似乎真的可以解决问题,即使对于字母数字值也是如此。谢谢。【参考方案2】:

让我们看一些测试用例 - 尝试在 JS 控制台中运行以下表达式:

"a" < "b"

"aa" < "ab"

"aaa" < "aab"

全部返回真。

JavaScript 逐个字符地比较字符串,在字母表中“a”在“b”之前——因此小于。

在你的情况下,它是这样工作的 -

1 . "a​aaa" a​b"

比较前两个“a”字符 - 都相等,让我们移到下一个字符。

2 。 "a​a​​aa" b​​"

比较第二个字符“a”和“b”——哇! “a”在“b”之前。返回真。

【讨论】:

有关特殊字符的讨论,例如 Č,č,Š,š,Ž,ž,请参阅 ***.com/questions/6909126/… 令人印象深刻的是,这是本机内置的! 要记住的是大写字母。 "a" &lt; "b" === true"a" &lt; "B" === false. 是的,它按 asciibetically 排序 @chrisjshields - 哇哦 - 我以前从未听过这个词......我喜欢它!【参考方案3】:

请记住,像 "x" > "X" 这样的字符串比较是区分大小写的

"aa" < "ab" //true
"aa" < "Ab" //false

您可以使用.toLowerCase() 进行不区分大小写的比较。

【讨论】:

【参考方案4】:

"a".localeCompare("b") 实际上应该返回-1,因为ab 之前排序

http://www.w3schools.com/jsref/jsref_localecompare.asp

【讨论】:

如果您的意思是对我的回答发表评论,那么您是对的。我的答案曾经错误地将结果显示为 1,所以我更正了。【参考方案5】:

假设我们有一个对象数组:

 name : String 

然后我们可以按如下方式对数组进行排序:

array.sort(function(a, b) 
    var orderBool = a.name > b.name;
    return orderBool ? 1 : -1;
);

注意:请注意大写字母,由于您的目的,您可能需要将字符串转换为小写。

【讨论】:

如果它们相等,用于排序的函数应该返回 0。此函数仅返回 -1 或 1。 @Steve - 好吧,务实地说,这没关系,因为用户不会有任何改变。也就是说,我同意 - 这不是一个符合规范的比较器,它会导致不必要的相等字符串交换。在小型(或足够独特的)数组上不会引起注意,但在具有大部分相同元素的大型集合上会减慢速度。

以上是关于按字母顺序比较 2 个字符串以进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用冒泡排序对Java中的名称数组按字母顺序排序

首先按频率对字符串中的字符进行排序,然后按字母顺序排序

在 C++ 中使用链表按字母顺序对字符串进行排序

JAVA按着字典顺序排序

按字母顺序对字符串列表进行排序 (C)

按字母顺序排列单词