Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift/Xcode中对1个数组进行排序,并根据相同的键对多个其他数组进行重新排序_Ios_Arrays_Xcode_Swift_Sorting - Fatal编程技术网

Ios 如何在Swift/Xcode中对1个数组进行排序,并根据相同的键对多个其他数组进行重新排序

Ios 如何在Swift/Xcode中对1个数组进行排序,并根据相同的键对多个其他数组进行重新排序,ios,arrays,xcode,swift,sorting,Ios,Arrays,Xcode,Swift,Sorting,对不起,问题的措辞很复杂。我的主要经验是使用PHP,它有一个名为array_multisort的命令。语法如下: bool array_multisort ( array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $... ]]] ) 它允许您对1个数组进行排序,并根据原始数组中的键更改对多个其他数组进行重新排序 Swift/Xc

对不起,问题的措辞很复杂。我的主要经验是使用PHP,它有一个名为array_multisort的命令。语法如下:

bool array_multisort ( array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $... ]]] )
它允许您对1个数组进行排序,并根据原始数组中的键更改对多个其他数组进行重新排序

Swift/Xcode 7.2中是否有等效命令

我目前有一组阵列:

名字 年龄 城市 国家 活跃的


Active是用户在我的应用程序中处于活动状态的时间数组(以秒为单位)。我希望将降序或升序以及其他数组更改为保持一致。

您可以按排序顺序创建索引数组,并将其用作映射:

var names = [ "Paul", "John", "David" ]
var ages  = [  35,    42,     27 ]

let newOrder = names.enumerate().sort({$0.1<$1.1}).map({$0.0})

names = newOrder.map({names[$0]})
ages  = newOrder.map({ages[$0]})
var name=[“保罗”、“约翰”、“大卫”]
变量年龄=[35,42,27]
让newOrder=names.enumerate().sort({$0.1[Int]
{return self.enumerated().sorted{order($0.1,$1.1)}.map{$0.0}
}
扩展阵列
{
func重新排序(otherArray:inout[T])->[Element]
{
otherArray=self.map{otherArray[$0 as!Int]}
回归自我
}
}
名字。顺序(由:[T]
{
返回self.map{otherArray[$0 as!Int]}
}
}
(名字、年龄、城市、国家、活动)=
{( 
$0.重新排序(名字),
$0.重新订购(账龄),
$0.重新订购(城市),
$0.重新订购(国家),
$0.重新排序(活动)
)} 

(firstNames.ordering(by:我会按照@AntonBronnikov的建议,将您的所有属性放入一个结构中,对特定的
struct
创建一个
数组
,然后对其进行排序


此数据具有明显的相关性,是一种更简洁的方法。

编辑此方法适用于2个阵列:

添加到@AlainT answer,但使用
zip

var names = [ "Paul", "John", "David" ]
var ages  = [  35,    42,     27 ]

let sortedTuple = zip(names, ages).sort { $0.0.0 < $0.1.0 }
var name=[“保罗”、“约翰”、“大卫”]
变量年龄=[35,42,27]
让sortedTuple=zip(姓名、年龄)。排序{$0.0.0<$0.1.0}
更一般的东西:

names.enumerate().sort({$0.1<$1.1}).map({ (name: $0.1, age: ages[$0.0]) })

names.enumerate().sort({$0.1我认为AlainT:s的解决方案更可取,但为了扩展各种选项,下面的解决方案模拟了
zip5
方法可以让我们实现的功能(如果我们可以使用
zip
将5个序列压缩在一起,而不是限制为2个):

/*示例阵列*/
var firstName:[字符串]=[“大卫”、“保罗”、“丽莎”]
变量年龄:[Int]=[17,27,22]
var city:[字符串]=[“伦敦”、“罗马”、“纽约”]
变量国家:[字符串]=[“英格兰”、“意大利”、“美国”]
活动变量:[Int]=[9062995060]
/*创建一个包含5元组的数组,以保存上面数组的成员。
这是一种有点模仿5元组zip版本的方法*/
变量五元组:[(String,Int,String,String,Int)]=[]

对于0中的i。为什么不定义一个结构类型来保存属性firstName、age、city、country、active。然后创建一个该结构的数组,并按您需要的方式对该数组进行排序?很酷的解决方案。让我看看我是否了解它的工作原理。
enumerate()
将原始名称数组映射到表单(索引、对象)的元组数组中。然后对这些元组进行排序,其中$0.1表示要比较的第一个对象,即元组中的第二个条目(名称字符串)。将排序结果映射为返回每个元组的索引项数组。谢谢Alain T。您的代码非常适合我的需要。单行解决方案非常好。接下来的问题是:“类型”是什么关于newOrder?这是一个索引数组,因此:[Int]虽然AlainT:s的答案概括为OP:s的两个以上数组的示例(按排序顺序的索引可以应用于每个数组),但zip仅限于成对(2元组),在这种情况下,这不是一个真正的选项。
zip
也是我的第一个方法,大约30分钟前,但它最终变成了一个手动的5-zip,不是很漂亮:)@dfri credits去@AlainT无论如何,诀窍是
枚举
。我想我们更喜欢返回元组:)是的,我认为他的解决方案在这种情况下是最通用的。为了完整起见,我还添加了我的手动zip5解决方案。只是一个输入错误:
quintuplarr.count==0
。如果使用命名元组…但这只是一个错误preference@FranMowinckel啊,谢谢。对于这个技术示例,我将不命名元组。
extension Array
{
   func reordered<T>(_ otherArray:[T]) -> [T] 
   {
      return self.map{otherArray[$0 as! Int]}
   }
}

(firstNames,ages,cities,countries,actives) = 
    {( 
       $0.reordered(firstNames), 
       $0.reordered(ages), 
       $0.reordered(cities),
       $0.reordered(countries), 
       $0.reordered(actives) 
    )} 
    (firstNames.ordering(by:<))
var names = [ "Paul", "John", "David" ]
var ages  = [  35,    42,     27 ]

let sortedTuple = zip(names, ages).sort { $0.0.0 < $0.1.0 }
names.enumerate().sort({$0.1<$1.1}).map({ (name: $0.1, age: ages[$0.0]) })
/* example arrays */
var firstName: [String] = ["David", "Paul", "Lisa"]
var age: [Int] = [17, 27, 22]
var city: [String] = ["London", "Rome", "New York"]
var country: [String] = ["England", "Italy", "USA"]
var active: [Int] = [906, 299, 5060]

/* create an array of 5-tuples to hold the members of the arrays above.
   This is an approach somewhat mimicking a 5-tuple zip version.        */
var quinTupleArr : [(String, Int, String, String, Int)] = []
for i in 0..<firstName.count {
    quinTupleArr.append((firstName[i], age[i], city[i], country[i], active[i]))
}

/* sort w.r.t. 'active' tuple member */
quinTupleArr.sort { $0.4 < $1.4 }

/* map back to original arrays */
firstName = quinTupleArr.map {$0.0}
age = quinTupleArr.map {$0.1}
city = quinTupleArr.map {$0.2}
country = quinTupleArr.map {$0.3}
active = quinTupleArr.map {$0.4}