Ios 如何从swift中的浮点数数组中获取前2个最大值?

Ios 如何从swift中的浮点数数组中获取前2个最大值?,ios,arrays,swift,Ios,Arrays,Swift,我需要从一个浮点数数组(即一个最大值和一个第二个最大值)中获取最大值2。是否有任何简单的方法可以使数组与其索引保持一致,或者我是否需要为此更改数组的结构?您可以使用enumerate()创建包含(索引,值)的元组数组然后按值对该数组进行排序,以找到两个最大的值: let arr: [Float] = [1.2, 3.14, 1.609, 2.718, 0.3] // Create an array of (index, value) tuples sorted by value // in d

我需要从一个浮点数数组(即一个最大值和一个第二个最大值)中获取最大值2。是否有任何简单的方法可以使数组与其索引保持一致,或者我是否需要为此更改数组的结构?

您可以使用
enumerate()
创建包含(索引,值)的元组数组然后按值对该数组进行排序,以找到两个最大的值:

let arr: [Float] = [1.2, 3.14, 1.609, 2.718, 0.3]

// Create an array of (index, value) tuples sorted by value
// in decreasing order
let result = arr.enumerate().sort { $0.1 > $1.1 }
print(result)

您可以使用
enumerate()
创建包含(索引、值)的元组数组,然后按值对该数组进行排序,以找到两个最大的值:

let arr: [Float] = [1.2, 3.14, 1.609, 2.718, 0.3]

// Create an array of (index, value) tuples sorted by value
// in decreasing order
let result = arr.enumerate().sort { $0.1 > $1.1 }
print(result)

只需对数组排序并获取所需的值

var array1 = [2.1, 2.2, 2.5, 3.0, 4.2, 2]

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

//One way 
let firstMax = array2[0]
let secondMax = array2[1]

//Second way
let firstMax = array2.removeFirst()
let secondMax = array2.removeFirst()
编辑

如果你想要索引,只需要像

let maxPos = array1.indexOf(firstMax)
let secMaxPos = array1.indexOf(secondMax)
如果你对这些东西感到困惑,只需遵循以下基本原则

var max = -1.0, maxPos = -1, secMax = -1.0, secMaxPos = -1
for (index, value) in array1.enumerate() {
    if value > max {
        max = value
        maxPos = index
    } else if value > secMax {
        secMax = value
        secMaxPos = index
    }
}
print("max:\(max)->pos:\(maxPos)::secMax:\(secMax)->secMaxPos:\(secMaxPos)") 

只需对数组排序并获取所需的值

var array1 = [2.1, 2.2, 2.5, 3.0, 4.2, 2]

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

//One way 
let firstMax = array2[0]
let secondMax = array2[1]

//Second way
let firstMax = array2.removeFirst()
let secondMax = array2.removeFirst()
编辑

如果你想要索引,只需要像

let maxPos = array1.indexOf(firstMax)
let secMaxPos = array1.indexOf(secondMax)
如果你对这些东西感到困惑,只需遵循以下基本原则

var max = -1.0, maxPos = -1, secMax = -1.0, secMaxPos = -1
for (index, value) in array1.enumerate() {
    if value > max {
        max = value
        maxPos = index
    } else if value > secMax {
        secMax = value
        secMaxPos = index
    }
}
print("max:\(max)->pos:\(maxPos)::secMax:\(secMax)->secMaxPos:\(secMaxPos)") 

试试你的戏吧,高兰德

var项目=[2.01,3.95,1.85,2.65,1.6]

var sorted=item.sort({$0>$1})


打印(已排序)

尝试播放gorund

var项目=[2.01,3.95,1.85,2.65,1.6]

var sorted=item.sort({$0>$1})


打印(已排序)

基本思想是在数组中循环,选择最大和第二大项

一些可能难以阅读的简短代码:

let myFloatArray : [Float] = ...
let top2 = myFloatArray.enumerated().reduce(((-1, Float.nan), (-1, Float.nan)), combine: { t, v in
    // Check if value is larger than first item in tuple
    if (!(v.1 <= t.0.1)) {
        // Check if value is larger than second item in tuple
        if (!(v.1 <= t.1.1)) {
            // Return with new value as largest
            return (t.1, v)
        } else {
            // Return with new value as next largest
            return (v, t.1)
        }
    }
    // Return old result
    return t
})
让myFloatArray:[Float]=。。。
让top2=myFloatArray.enumerated().reduce((-1,Float.nan),(-1,Float.nan)),合并:{t,v in
//检查值是否大于元组中的第一项

if(!(v.1的基本思想是在数组中循环,并选择最大和第二大项

一些可能难以阅读的简短代码:

let myFloatArray : [Float] = ...
let top2 = myFloatArray.enumerated().reduce(((-1, Float.nan), (-1, Float.nan)), combine: { t, v in
    // Check if value is larger than first item in tuple
    if (!(v.1 <= t.0.1)) {
        // Check if value is larger than second item in tuple
        if (!(v.1 <= t.1.1)) {
            // Return with new value as largest
            return (t.1, v)
        } else {
            // Return with new value as next largest
            return (v, t.1)
        }
    }
    // Return old result
    return t
})
让myFloatArray:[Float]=。。。
让top2=myFloatArray.enumerated().reduce((-1,Float.nan),(-1,Float.nan)),合并:{t,v in
//检查值是否大于元组中的第一项

如果(!(v.1var array1=[1,2,3,4,5]

var array2=array1.sorted(){$0>$1}

打印(array2)

//单程

设firstMax=array2[0]

设secondMax=array2[1]

//答复

打印(firstMax)


打印(秒最大值)

变量数组1=[1,2,3,4,5]

var array2=array1.sorted(){$0>$1}

打印(array2)

//单程

设firstMax=array2[0]

设secondMax=array2[1]

//答复

打印(firstMax)


打印(秒最大值)

排序并获取前2个?排序并获取前2个?您的代码既好又短,但它没有为我提供索引。您的编辑结果有一些错误:max:4.2->pos:4::secMax:2.0->secMaxPos:5您的代码既好又短,但它没有为我提供索引。您的编辑有一些错误结果将是:max:4.2->pos:4::secMax:2.0->secMaxPos:5
var largestIndex = -1;
var largestValue = Float.nan;
var secondLargestIndex = -1;
var secondLargestValue = Float.nan;
for index in 0..<myFloatArray.count {
    let value = myFloatArray[index];
    if (!(value <= secondLargestValue)) {
        if (!(value <= largestValue)) {
            secondLargestValue = largestValue;
            secondLargestIndex = largestIndex;
            largestValue = value;
            largestIndex = index;
        } else {
            secondLargestValue = value;
            secondLargestIndex = index;
        }
    }
}