(我是編碼和 Swift 的新手;如果以下內容對更有經驗的人來說是顯而易見的,請提前道歉。我搜索了 Stack Overflow 和許多其他網站,只發現了類似的問題,但沒有一個和我的完全一樣,并且沒有一個具有明顯適應性的答案。這里是......)
我的問題是:在 Swift 中,我如何評估一個陣列陣列并回傳一個新陣列,該陣列已從之前出現的每個位置洗掉了指定的整數?在不知道這是否是最好的方法的情況下,我想我想要做的是過濾一個二維陣列。
這是背景:使用 Swift Playgrounds,我正在構建一個簡單的模擬,以模擬排名選擇投票的作業原理。在我的代碼中,這涉及創建一個包含其他陣列的陣列。我命名為“allBallots”的外部陣列是內部陣列的集合,每個內部陣列都包含一個或多個整數。每個整數代表對特定候選人的投票。
例如,allBallots 陣列可能如下所示: [[3, 2, 0, 1], [1, 2], [4, 3, 2], [0, 1, 4, 2], [4, 1 ], [3], [3, 2, 0], [2], [0, 1], [4, 3, 1, 0], [1, 0, 2, 4]]。這代表十一張選票(即,十一個內部陣列)——第一張選票將候選人 3 排在第一位,候選人 2 排在第二位,候選人 0 排在第三位,候選人 1 排在最后。第二張選票將候選人 1 排在第一位,將候選人 2 排在第二位,其他選票不排位,以此類推。
在每一輪模擬投票之后,我的代碼梳理內部陣列(即每個“選票”)并計算“第一名投票”的數量 - 即每個內部陣列中首先出現的值。接下來需要做的是洗掉獲得第一名最少選票的候選人的所有選票。在上面的例子中,0 和 1 都出現在前兩次,2 出現在前一次,3 和 4 分別出現在前 3 次。我的代碼計算出哪個值首先出現的次數最少 - 在上面的示例中,它是 2,因為 2 只首先出現一次。現在是時候洗掉所有出現的 2,但這是我卡住的地方。
我想從整個“allBallots”陣列中洗掉2 的所有值——而不僅僅是內部陣列中首先出現的實體。我嘗試過 .filter,但我無法弄清楚允許我在多維陣列上使用它的語法。
例如,如果我嘗試...
var newBallots = allBallots.filter { $0 != 2 }
...我收到錯誤訊息Cannot convert value of type '[Int]' to expected argument type 'Int'。我認為這是涉及型別系統的問題 - 我指定的型別(整數 2)與我的陣列的實際內容(其他陣列)之間存在不匹配,但我不知道如何解決它.
如果相反,我嘗試...
var newBallots = allBallots.filter { $0 != [2] }
...我沒有遇到錯誤,并且某些內容已被過濾,但僅洗掉了完全由 [2] 組成的內部陣列,而不是從整個陣列的所有位置洗掉 2。
如果相反,我嘗試...
var newBallots = allBallots.filter { $0.contains(2) }
...沒有錯誤,但 newBallots 僅包含 [[3, 2, 0, 1], [1, 2], [4, 3, 2], [0, 1, 4, 2], [3, 2, 0], [2], [1, 0, 2, 4]],這是奇數。四個陣列已被洗掉/過濾,但我不知道為什么這四個。我想要的是洗掉“2”的每個實體,這絕對不是發生的事情。我想我在這種情況下誤用了“.contains”,但我在這里的理解有限。
誰能建議我如何從它存在的每個位置的二維陣列中洗掉特定值?非常感謝任何幫助。
uj5u.com熱心網友回復:
有很多方法可以做到這一點,但您可以使用reduce或map
let allBallots = [[1, 2, 3], [1, 2]]
let newBallots = allBallots.reduce(into: []) { partial, element in
partial.append(element.filter { $0 != 2 })
}
print(newBallots) // [[1, 3], [1]]
let allBallots = [[1, 2, 3], [1, 2]]
let newBallots = allBallots.map { $0.filter { $0 != 2 } }
print(newBallots) // [[1, 3], [1]]
uj5u.com熱心網友回復:
如果您是編碼新手,則不應使用過濾器、映射、歸約等高階函式。您應該根據自己的思路進行編碼。
// 2-dimensional
let allBallots = [[1, 2, 3], [1, 2], [2, 0, 3, 4]]
var newBallots = [[Int]]()
// travel each 1-dimensional in 2-dimensional
for ballot in allBallots {
//This code below equal: `let ballotRemoved2 = ballot.filter { $0 != 2 }`
var ballotRemoved2 = [Int]()
for element in ballot {
if element != 2 { ballotRemoved2.append(element) }
}
newBallots.append(ballotRemoved2)
}
print(newBallots)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/526036.html
標籤:迅速多维数组筛选