有没有更好的方法来比较两个排序的数组?

时间:2016-01-21 20:51:28

标签: arrays swift comparison

在Swift中,我有两个数组,我从最大到最小排序,这意味着数组的值是Comparable。我想定义一种自定义方式来比较两个数组,以便说一个是“小于”另一个。具有较少元素的数组总是小于较大的数组。我提出的工作正常,但<运算符看起来太笨重了。它只是感觉应该有一些方法来浓缩它,或者有一个内置函数或内置函数的组合,将实现我想要的。这就是我所拥有的:

func <<T where T: Comparable>(lhs: [T], rhs: [T]) -> Bool {
  if lhs.count < rhs.count {
    return true
  }

  for i in 0..<lhs.count {
    if lhs[i] > rhs[i] {
      return false
    }
  }

  return true
}

let first = [9, 8, 7, 6, 4]
let second = [9, 8, 7, 6, 5]
let third = [8, 7, 6, 5, 4]
let fourth = [9, 8, 7, 6]

let firstSecondComp: Bool = first < second   // true
let secondFirstComp: Bool = second < first   // false
let secondThirdComp: Bool = second < third   // false
let thirdSecondComp: Bool = third < second   // true
let firstThirdComp: Bool = first < third     // false
let thirdFirstComp: Bool = third < first     // true

let fourthFirstComp: Bool = fourth < first   // true
let fourthSecondComp: Bool = fourth < second // true
let fourthThirdComp: Bool = fourth < third   // true

有什么方法可以改善比较函数的主体吗?

修改

修复Leo Dabus指出的崩溃并包括Martin R的回答:

func <<T where T: Comparable>(lhs: [T], rhs: [T]) -> Bool {
  if lhs.count < rhs.count {
    return true
  }
  else if lhs.count > rhs.count {
    return false
  }

  return !zip(lhs, rhs).contains { $0 > $1 }
}

1 个答案:

答案 0 :(得分:6)

您的比较功能可以写成

func <<T where T: Comparable>(lhs: [T], rhs: [T]) -> Bool {

    return lhs.count < rhs.count || !zip(lhs, rhs).contains { $0 > $1 }
}

此处zip()返回两者的对的枚举 数组,然后检查第一个是否有一个元素 array大于第二个数组中的对应元素。

这为您的所有测试用例提供了相同的结果。

正如@Leo正确注意到的那样,如果是第一个,你的功能会崩溃 数组比第二个元素多。使用zip(), 额外的元素被忽略。

备注:如果第一个数组较长,则比较应返回false 然后你可以把它写成

return lhs.count <= rhs.count && (lhs.count < rhs.count || !zip(lhs, rhs).contains { $0 > $1 })