我有两个数组:
GlobalArray:Array(Int,Array[String])
和SpecificArray:Array(Int,Int)
。
这两个中的第一个Int
是一个键,我想从GlobalArray
获取与该键对应的元素。
在伪代码中:
val v1
For each element of SpecificArray
Get the corresponding element from GlobalArray to use its Array[String]
If (sum <= 100)
for each String of the Array
update v1
// ... some calculation
sum += 1
println (v1)
我知道使用.map()
我可以浏览SpecificArray
的每个位置,但到目前为止,我能够做到这一点:
SpecificArray.map{x => val in_global = GlobalArray.filter(e => (e._1 == x._1))
// I don't know how to follow
}
答案 0 :(得分:1)
sum
如何影响逻辑以及v1
究竟是什么不清楚您的代码,但看起来您多次搜索GlobalArray
。如果是这样,那么将此数组转换为更适合搜索的数据结构是有意义的:Map
。你可以这样做
val globalMap = GlobalArray.toMap
然后你可以像这样加入字符串
println(SpecificArray.flatMap({case (k,v) => globalMap(k).map(s => (k,v,s))}).toList)
如果您只需要字符串,则可以使用
println(SpecificArray.flatMap({case (k,v) => globalMap(k)}).toList)
请注意,此代码假定SpecificArray
中的每个键都会在GlobalArray
中有匹配的键。如果不是这种情况,您应该使用其他方法来访问Map
之类的getOrElse
:
println(SpecificArray.flatMap({case (k,v) => globalMap.getOrElse(k, Array()).map(s => (k,v,s))}).toList)
<强>更新强>
如果sum
实际上是count
且它适用于整个“已加入”数据,而不是SpecificArray
中的每个键,则可以使用take
代替它。代码将是这样的:
val joined = SpecificArray2.flatMap({case (k,v) => globalMap.getOrElse(k, Array()).map(s => (s,v))})
.take(100) // use take instead of sum
然后你可以以任何你想要的方式使用joined
。构建v1
的已更新演示版已为v1 += String_of_GlobalArray + " = " + 2nd_Int_of_SpecificArray
的联接字符串here。我们的想法是使用mkString
而不是显式变量更新。
答案 1 :(得分:1)
注意需要更多优化
将GlobalArray转换为Venue: NYIT Auditorium on Broadway
1871 Broadway
New York, NY 10023
212.613.5536
以加快查找速度。
Map
如果val GlobalMap = GlobalArray.toMap
SpecificArray.flatMap(x => GlobalMap(x._1))
.foldLeft(0)((sum:Int, s:String) => {
if(sum<=100) {
// update v1
// some calculation
}
sum+1
})
中不存在SpecificArray
的所有键,则使用GlobalMap
答案 2 :(得分:1)
如下所示,我更喜欢componentWillMount() {
let user = firebase.auth().currentUser;
if (user != null) {
this.props.navigation.navigate('Drawer');
}
this.unsubscribe = firebase.auth().onAuthStateChanged(user => {
if (user) {
this.props.navigation.navigate('Drawer');
}
});
}
具有更好可读性的理解码。
for