2016-08-01 15 views
1

浮動小数点数の配列から2つの最大値を取得する必要があります。つまり、1つの最高値と1つの最高値を取得する必要があります。インデックスを取得する簡単な方法はありますか、これを構造化するには配列を変更する必要がありますか?スワイプで浮動小数点数の配列から最大2の最大値を取得するにはどうすればよいですか?

+0

ソートと最初の2を取得しますか? –

答えて

3

だけで配列をソートし、インデックスが同じようにそれらを取得したい場合に必要な値

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() 

EDIT

を取る

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)") 
+0

これはあなたのコードは良いと短いですが、私にインデックスを提供していません。 –

+0

ええ、私は答えを更新しました、それをチェックしてください。 –

2

あなたは(インデックス、値)が含まれているタプルの配列を作成するためにenumerate()を使用して、2つの最大の値を見つけるために、値によってその配列を並べ替えることができます。

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) 
[(1, 3.1400001), (3, 2.71799994), (2, 1.60899997), (0, 1.20000005), (4, 0.300000012)] 
let (topIndex, top) = result[0] 
print("top = \(top), index = \(topIndex)") 
let (secondIndex, second) = result[1] 
print("second = \(second), index = \(secondIndex)") 
second = 2.718, index = 3 
0

あなたのプレイgorundでみてください= [2.01、3.95,1.85,2.65,1.6]

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

ソート

VARアイテム

print(ソート済み)

0

基本的な考え方は、配列をループして最大と2番目に大きな項目を選択することです。

読みにくいかもしれないいくつかのショートコード:

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 
}) 

以上の明示的な変数名を持つ:

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; 
     } 
    } 
} 
関連する問題