【问题标题】:Sorting with a compare function使用比较功能进行排序
【发布时间】:2013-10-03 03:54:27
【问题描述】:

所以我知道给定一个数组,您可以使用自定义比较函数对其进行排序。

因此在 Javascript 中类似于以下内容:

var arr = [5,4,3,6,7,2];
arr.sort(function(a,b){
    if (a < b)
        return -1;
    else if (a > b)
        return 1;
    else
        return 0;
});

所以我的朋友说我不需要返回 0 来对这种情况下的列表进行排序。此外,他说我们可以从[true,false] 返回,而不是从[-1,0,1] 返回。真的吗? 我试图找到一个反例来反驳他的主张,但我做不到。我无法想象使用他的代码没有正确排序数组的情况。

这是我朋友给出的例子:

var arr = [5, 4, 3, 6, 7, 2];
arr.sort(function(a, b) {
    return a > b;
});

[-1,0,1] 的范围返回是一种好习惯吗?当整数具有可比性时,有什么必要性?我注意到这种情况适用于多种编程语言,而不仅仅是 javascript。就像C 中的这个例子一样。

【问题讨论】:

  • });(两次!)看起来不对。
  • 根据文档,你的朋友错了。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 请注意,它们不必只是[-1, 0, 1],它们可以是任何负值、0 或任何正值。这允许你做return a - b;
  • @Phil 所说的,你应该使用关键字var,除非你希望arr 是全球性的。

标签: javascript sorting


【解决方案1】:

告诉你的朋友他们肯定错了。

[0, 0, 0, -1, -1, -1, 2, 2, 2, 7, 6, 5, 4, 3].sort(function(a, b) { return a > b })

-> [2, 0, 0, -1, -1, -1, 0, 2, 2, 3, 4, 5, 6, 7]

【讨论】:

    【解决方案2】:

    不,这不是一个好习惯,你应该遵循语言规范,它说比较函数应该在第一个元素大于第二个时返回正值,当第一个元素小于第二个元素时返回负值第二,如果相等则为 0。

    您正在做的事情可能在某些实现中有效,但不会是可移植的。返回truefalse 可能会导致它们分别被强制转换为10。而有些排序算法只需要知道元素A是否大于元素B(比如Common Lisp语言指定它的SORT函数是一个布尔比较函数,所以显然要求实现使用这样的算法),所以可以得到想要的结果。但是如果一个实现依赖于三态逻辑,它就行不通——返回false0 会使其认为这些元素是等价的,并且可能无法正确排序它们。

    【讨论】:

      猜你喜欢
      • 2014-05-30
      • 2022-01-05
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多