gpt4 book ai didi

arrays - 设置交集错误

转载 作者:行者123 更新时间:2023-11-30 10:41:42 26 4
gpt4 key购买 nike

我正在创建一个处理地理信息的程序。我有包含相互接触的地理单位的数据。失败的函数旨在根据人口将相邻单位添加到数组中(例如,它从一个单位开始,然后将人口最多的相邻单位添加到数组中,然后添加接触其中一个单位的人口最多的单位在数组中,并继续此操作,直到达到人口限制)。我这样做的方法是使用 for 循环,然后使用已按人口排序的总单位数组。然后,我使用数组中单元的邻居与总单元数组中每个单元的邻居之间的交集找到第一个(因此人口最多)邻居的索引。以下是我的代码(请原谅笨拙):

 func createDistrict () {
if useBoard.isEmpty == false {
useBoard.sort(by: {$0.population > $1.population})
var maxPop = useBoard.first!.population
district.removeAll()
district.append(useBoard.first!)
useBoard.removeFirst()

for i in 0...useBoard.count - 1 {
if useBoard.indices.contains(i) {
if useBoard[i] == nil || district.map({$0.population}).reduce(0,+) > districtMax {
break
}
} else {
break
}
useBoard.sort(by: {$0.population > $1.population})
var superArray:[Precinct] = []
district.forEach { (z) in
superArray += z.neighbors
Array(Set(superArray))
}
var nextPre = useBoard.firstIndex { (l) -> Bool in
Set(l.neighbors).intersection(Set(superArray)).isEmpty == false
}
if nextPre == nil {
break
}else {
var temporary = Set(useBoard[nextPre!].neighbors).intersection(Set(superArray))
var newString = ""
var newTemp = Array(temporary)
for t in 0...newTemp.count - 1 {
var next = useBoard.firstIndex { (k) -> Bool in
k == newTemp[t]
}
newString.append("\(newTemp[t]) (\(next)), ")
}
print("\(useBoard[nextPre!].precinctID) (\(nextPre!)) touches \(newString)")


}

district.append(useBoard[nextPre!])
useBoard.remove(at: nextPre!)
}
}
district.forEach { (p) in
print("\(p.precinctID)")
}
}

在此函数中,使用了 var nextPre = useBoard.firstIndex { (l) -> Bool in Set(l.neighbors).intersection(Set(superArray)).isEmpty == false}找到人口最多的邻居的索引。但是,当我使用 print 测试它时,我得到了不正确的输出。在下面的摘录中,括号中的值只是索引,并不重要。输出:

2104 (8) touches 1987 (Optional(710)), 2676 (Optional(1591)), 
2387 (10) touches 2105 (Optional(2140)),
2274 (11) touches 2273 (Optional(52)), 2386 (Optional(236)),
2275 (14) touches 2276 (Optional(22)), 2105 (Optional(2138)), 2273 (Optional(51)),
2276 (21) touches 2389 (Optional(1638)), 2273 (Optional(50)), 2274 (nil), 2275 (nil), 2277 (Optional(2771)), 2386 (Optional(234)),
2067 (35) touches 2404 (Optional(76)), 2212 (Optional(944)),
2406 (40) touches 2404 (Optional(75)), 2070 (Optional(1771)),
2440 (42) touches 2212 (Optional(942)), 2388 (Optional(497)), 2441 (Optional(1364)),
2273 (46) touches 2386 (Optional(230)), 2276 (nil), 2064 (Optional(384)), 2275 (nil), 2105 (Optional(2133)), 2274 (nil), 2387 (nil),
1795 (55) touches 1891 (Optional(1212)),
1908 (41) touches 2638 (Optional(2568)), 1869 (Optional(474)),
2404 (70) touches 2212 (Optional(938)), 2070 (Optional(1766)), 2069 (Optional(365)), 2068 (Optional(581)), 1743 (Optional(2453)), 2405 (Optional(2442)), 2387 (nil), 2105 (Optional(2130)), 2284 (Optional(2792)),
2736 (70) touches 2548 (Optional(1314)), 2420 (Optional(1305)),
1798 (52) touches 2419 (Optional(270)),
1907 (45) touches 1912 (Optional(1611)), 2737 (Optional(2082)),

如您所见,邻居相差 1。例如,2104 是第一个单位。然后 2387 接触 2105,即 2104 + 1。然后 2274 接触 2386,即 2387 - 1。然后 2275 接触 2105,即 2104 + 1。 .intersection 应该找到第一个接触的单元数组中的单位,但它找到第一个接触单位名称 + 1 的单位。我不知道这是如何发生的,因为地理单位存储在自定义对象中,而不是整数或任何其他数字变量中。这是自定义对象:

class Precinct {
var precinctID:String
var population:Int
var neighbors:[Precinct]
init(precinctID:String, population:Int, neighbors:[Precinct]){
self.precinctID = precinctID
self.population = population
self.neighbors = neighbors
}
}

extension Precinct: Equatable {
static func == (lhs: Precinct, rhs: Precinct) -> Bool {
return lhs.precinctID == rhs.precinctID && lhs.population == rhs.population && lhs.neighbors == rhs.neighbors
}
}

extension Precinct: Hashable {
var hashValue: Int {
return precinctID.hashValue ^ population.hashValue
}
}

extension Precinct: CustomStringConvertible {
var description: String {
return "\(precinctID)"
}


}

出了什么问题以及如何修复它?谢谢。

最佳答案

问题是由于您在迭代 useBoard 的同时删除了 useBoard 的元素。您正在打印索引 "\(newTemp[t]) (\(next)), " ,然后在五行后删除索引;在重复该过程之前。虽然您可以更改正在迭代的集合的值,但切勿同时更改集合的大小。

第一步可能是在运行外循环之前复制 useBoard。保持它不变,以便您迭代其所有内容,但将副本用于所有逻辑。我无法理解您代码的意图。

就哈希而言,这不是您的问题。然而这并不理想。 Swift 提供了一个几乎总是更好的默认哈希值。只需将扩展名更改为此即可让 Swift 合成自己的算法。

extension Precinct: Hashable {}

有几个问题。请删除外循环中对 useBoard 进行排序的调用。这没有任何效果,因为 useBoard 在进入循环之前已经排序了。另外 Array(Set(superArray)) 不会为您做任何事情。

祝你好运。

关于arrays - 设置交集错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56640237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com