【问题标题】:Sort Array based on other Sorted Array基于其他排序数组的排序数组
【发布时间】:2015-02-10 18:41:46
【问题描述】:

我有两个大小相同的数组,我对第二个数组进行排序。如何排列第一个匹配的?

基本示例(想象将Ints 替换为Strings):

var array1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

var array2 = [5, 2, 3, 4, 5, 6, 8, 5, 4, 5, 1] 

array2.sort = ({ $0 > $1})

结果:

array2 is now [8, 6, 5, 5, 5, 5, 4, 4, 3, 2, 1]

如何对array1的索引值进行排序以匹配array2?

array1 should now be [6, 5, 0, 4, 7, 9, 3, 8, 2, 1, 0]

【问题讨论】:

  • 我会说创建一个对象数组并排序对象...

标签: sorting swift


【解决方案1】:

Zip2sortedmap

array1 = map(sorted(Zip2(array1, array2), {$0.1 > $1.1}), { $0.0 })

结合filter

var array1 = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
var array2 = [5, 2, 3, 4, 5, 6, 8, 5, 4, 5, 1]

func isEven(x:Int) -> Bool {
    return x % 2 == 0
}

let result = map(sorted(filter(Zip2(array1, array2), { isEven($0.1) }), {$0.1 > $1.1}), { $0.0 })
// -> ["6", "5", "3", "8", "1"]

如您所见,该行太复杂了,您可能要Array方法链语法:

let result2 = Array(Zip2(array1, array2))
    .filter({ isEven($0.1) })
    .sorted({ $0.1 > $1.1 })
    .map({ $0.0 })

无论如何,如果你的array2[PFObject],你可以实现如下功能:

func isOpen(restaurant: PFObject, forTime time: String, onDay day: Int) -> Bool {

    // return `true` if the restaurant is open, `false` otherwise

}

【讨论】:

  • 这对函数也有用吗?如果我为 array2 filterAreOpen(detailsForFoodPhotos, forTime: time.time, onDay: time.dayOfWeek) 调用一个函数并以相同的方式映射 array1?
  • 会不会像这样:map(filterAreOpen(detailsForFoodPhotos, forTime: time.time, onDay: time.dayOfWeek), { $0.0 })
  • 什么是filterAreOpen,也许是this?如果是这样,我认为它不会起作用。我将添加结合filter的基本示例。
  • 非常感谢。但是如果我的filterAreOpen 函数返回一个数组,过滤器会起作用吗?还是我需要创建一个可以过滤单个数据的新函数? (请参阅已编辑的问题)
  • 后者:需要新建一个函数。这并不难,你的filterAreOpen 已经有filter 逻辑。你可以提取它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 2015-04-13
  • 2021-10-15
相关资源
最近更新 更多