Arrays 如何在数组a中找到数组B中没有出现的值的随机索引?

Arrays 如何在数组a中找到数组B中没有出现的值的随机索引?,arrays,swift,Arrays,Swift,假设数组A包含以下内容: [0, 1, 8, 3, 10, 6, 2] [1, 2] 数组B包含以下内容: [0, 1, 8, 3, 10, 6, 2] [1, 2] 如何在数组a中生成数组B中未显示值的随机索引?上述示例中可能的索引为: 0, 2, 3, 4, 5 但是如何在Swift中实现这一点呢?首先,您必须在两个阵列之间生成一个差异(除非它们都非常大,在这种情况下,随机递归尝试可能会产生更好的性能) 然后,您所要做的就是找到一个您想要使用的随机索引并访问所述元素: #if os

假设数组A包含以下内容:

[0, 1, 8, 3, 10, 6, 2]
[1, 2]
数组B包含以下内容:

[0, 1, 8, 3, 10, 6, 2]
[1, 2]
如何在数组a中生成数组B中未显示值的随机索引?上述示例中可能的索引为:

0, 2, 3, 4, 5

但是如何在Swift中实现这一点呢?

首先,您必须在两个阵列之间生成一个差异(除非它们都非常大,在这种情况下,随机递归尝试可能会产生更好的性能)

然后,您所要做的就是找到一个您想要使用的随机索引并访问所述元素:

#if os(Linux)
    let j = Int(random() % ((count-1)))
#else
    let j = Int(Int(arc4random()) % ((count-1)))
#endif
会给你一个合适的索引

如果然后使用此索引和元素在数组中查找原始元素,您将得到结果

如果您的元素是整数,因此可能发生冲突,那么我会递归地找到它来解决您的问题。请记住,这可能会导致性能降低

查看swift中集合的功能编程部分:

例如,您可以通过以下方式使用过滤器(我不知道这是否是最好的方式):


首先,您必须在这两个阵列之间生成一个差异(除非它们都非常大,在这种情况下,随机递归尝试可能会产生更好的性能)

然后,您所要做的就是找到一个您想要使用的随机索引并访问所述元素:

#if os(Linux)
    let j = Int(random() % ((count-1)))
#else
    let j = Int(Int(arc4random()) % ((count-1)))
#endif
会给你一个合适的索引

如果然后使用此索引和元素在数组中查找原始元素,您将得到结果

如果您的元素是整数,因此可能发生冲突,那么我会递归地找到它来解决您的问题。请记住,这可能会导致性能降低

查看swift中集合的功能编程部分:

例如,您可以通过以下方式使用过滤器(我不知道这是否是最好的方式):


当您想要使用数组元素及其索引时,
enumerated()
可能是一个很好的工具:

var a = [0, 1, 8, 3, 10, 6, 2]
var b = [1, 2]
var possibleIndices = a.enumerated()
    .filter{!b.contains($0.element)}
    .map{$0.offset}
print(possibleIndices)
//->[0, 2, 3, 4, 5]
(当
b
可能较大时,最好将其设置为

然后:

(当我们可以假设
b
从不保存
a
的所有内容时)


如果无法满足上述假设,
可能条件
可以为空。因此,您最好将
randomIndex
设置为可选:

var randomIndex: Int? = nil
if !possibleIndices.isEmpty {
    var randomIndexToPossibleIndices = Int(arc4random_uniform(UInt32(possibleIndices.count)))
    randomIndex = possibleIndices[randomIndexToPossibleIndices]
}

感谢Martin R.

当您想要使用数组元素及其索引时,
枚举()可以是一个很好的工具:

var a = [0, 1, 8, 3, 10, 6, 2]
var b = [1, 2]
var possibleIndices = a.enumerated()
    .filter{!b.contains($0.element)}
    .map{$0.offset}
print(possibleIndices)
//->[0, 2, 3, 4, 5]
(当
b
可能较大时,最好将其设置为

然后:

(当我们可以假设
b
从不保存
a
的所有内容时)


如果无法满足上述假设,
可能条件
可以为空。因此,您最好将
randomIndex
设置为可选:

var randomIndex: Int? = nil
if !possibleIndices.isEmpty {
    var randomIndexToPossibleIndices = Int(arc4random_uniform(UInt32(possibleIndices.count)))
    randomIndex = possibleIndices[randomIndexToPossibleIndices]
}

感谢Martin R.

使用电视机怎么样

let a = [0, 1, 8, 3, 10, 6, 2]
let b = [1, 2]

var setA = Set(a)
var setB = Set(b)

setA.subtract(setB)

var index: Int? = nil
if let first = setA.first {
    index = a.index(of: first)
}
// if index == nil no such index exists

用电视机工作怎么样

let a = [0, 1, 8, 3, 10, 6, 2]
let b = [1, 2]

var setA = Set(a)
var setB = Set(b)

setA.subtract(setB)

var index: Int? = nil
if let first = setA.first {
    index = a.index(of: first)
}
// if index == nil no such index exists


“首先,您必须在两个阵列之间生成差异”是的,但我该怎么做?其他答案仅显示搜索差异时剩余的值,但我需要索引。阵列很小。@J.Doe我提供了我的答案来帮助您。请记住,如果您拥有大量集合,一些更高级的算法可能会带来更好的性能。但为此,你必须求助于一些更高级的文档和/或库。谢谢你的回答和时间,但我更喜欢OOper的一行:)@J.Doe他有正确的信息来接受答案,因为他的答案在很多方面都更好。“首先,你必须在两个阵列之间生成一个差异”是的,但是我该怎么做呢?其他答案仅显示搜索差异时剩余的值,但我需要索引。阵列很小。@J.Doe我提供了我的答案来帮助您。请记住,如果您拥有大量集合,一些更高级的算法可能会带来更好的性能。但为此,你必须求助于一些更高级的文档和/或库。谢谢你的回答和时间,但我更喜欢OOper的一行:)@J.Doe他有正确的信息来接受答案,因为他的答案在很多方面都更好。或者flatMap:
let indexes=a.enumerated().flatMap{bset.contains($0.element)?nil:$0.offset}
还应该检查
可能的索引是否为空
arc4random_uniform(0)
返回
0
,在这种情况下它将不是一个有效的索引。或者flatMap:
let index=a.enumerated().flatMap{bset.contains($0.element)?nil:$0.offset}可能的索引是否为空
arc4random_uniform(0)
返回
0
,在这种情况下该索引无效。数组有多大?是否保证存在这样一个索引?@MartinR非常小(~20个int值),数组B总是小于或等于数组A,数组B只能保存数组A保存的值。我看到你对答案的评论,我正在尝试将你的评论和答案结合起来。数组有多大?是否保证存在这样一个索引?@MartinR非常小(~20个int值),数组B总是小于或等于数组A,数组B只能保存数组A保存的值。我看到你对一个答案的评论,我正在尝试将你的评论和那个答案结合起来。谢谢你的回答和时间,但我更喜欢OOper的一行:)这里的随机性在哪里?@Martiner a集合是无序的,对于OP来说,获取第一个是否“随机”(实现定义)就足够了还不清楚。如果你需要更好的随机性,你必须结合其他解决方案的部分:-)@J.Doe,@MartinR为“真实”随机性一行(可能会崩溃:-):
a.index(of:Array(Set(a).subtract(Set(b))[arc4random_uniform(Set(a).subtract(Set(b))
,但认真地说,OOPer的答案更好。谢谢你