当前位置: 首页 > 面试题库 >

扩展数组以检查它是否在Swift中排序?

林鸿飞
2023-03-14
问题内容

我想扩展Array类,以便它可以知道它是否已排序(升序)。我想添加一个称为的计算属性isSorted。如何声明数组的元素具有可比性?

我目前在Playground中的实现

extension Array {
  var isSorted: Bool {
    for i in 1..self.count {
      if self[i-1] > self[i] { return false }
    }
    return true
  }
}

// The way I want to get the computed property
[1, 1, 2, 3, 4, 5, 6, 7, 8].isSorted //= true
[2, 1, 3, 8, 5, 6, 7, 4, 8].isSorted //= false

错误 Could not find an overload for '>' that accepts the supplied arguments

当然,我仍然遇到错误,因为Swift不知道如何比较元素。如何在Swift中实现此扩展?还是我在这里做错了什么?


问题答案:

自由函数的替代解决方案是执行Swift的内置函数Array.sortArray.sorted方法,并要求您将合适的比较器传递给该方法:

extension Array {
    func isSorted(isOrderedBefore: (T, T) -> Bool) -> Bool {
        for i in 1..<self.count {
            if !isOrderedBefore(self[i-1], self[i]) {
                return false
            }
        }
        return true
    }
}

[1, 5, 3].isSorted(<) // false
[1, 5, 10].isSorted(<) // true
[3.5, 2.1, -5.4].isSorted(>) // true


 类似资料:
  • 这是第一个数组。 用户可以输入不超过100个整数,如果用户输入负数,将停止。 这是第二个数组。 用户可以输入不超过100个整数,如果用户输入负数将结束。 打印出第一个整数列表 rint出第二个整数列表 问题在于,它不会检查数组是否按升序排列。↓↓↓ 如果inOder=1,我需要合并这两个数组。

  • 问题内容: 在Swift中,是否有任何方法可以检查数组中是否存在索引而不会引发致命错误? 我希望我可以做这样的事情: 但是我明白了 致命错误:数组索引超出范围 问题答案: Swift中的一种优雅方式:

  • 本文向大家介绍检查它在C ++中是否是一个好的数组,包括了检查它在C ++中是否是一个好的数组的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个称为正整数的数组。我们必须选择一些数字子集,然后将每个元素乘以一个整数,然后将所有这些数字相加。如果我们可以通过任何可能的子集和被乘数从数组中得到1的和,则该数组将是一个很好的数组。 我们必须检查数组是否正确。 因此,如果输入类似于[12,23,7,

  • 问题内容: 我正在尝试对Array进行扩展,以允许将可选T的数组转换为非可选T的数组。 例如,这可以写成这样的自由函数: 但是,我无法将此作为扩展。我试图告诉编译器,扩展名仅适用于可选值数组。这是我到目前为止的内容: (它不会编译!) 问题答案: 不可能限制为通用结构或类定义的类型-数组旨在与任何类型一起使用,因此您不能添加适用于类型子集的方法。类型约束只能在声明泛型时指定 实现所需功能的唯一方法

  • 问题内容: 我正在尝试检查是否存在用户默认值,如下所示: 但是,无论对象还不存在,它将始终返回true是什么?这是检查存在的正确方法吗? 问题答案: 阿斯通有一个很好的答案。请参阅下面的Swift 3版本。

  • 问题内容: 我知道我可以这样做: 然后只需编写语句中所需的代码。 还有其他方法可以检查它们是否相等? 问题答案: 怎么了 if(!Arrays.equals(array1,array2)) 与相同,即是同一数组。这不是大多数人期望的。 比较数组的内容。