我试图找到在Scala集合中查找对的最佳方式。例如,
val list = List(1,2,3)
应该产生这些对
(1,2) (1,3) (2,1) (2,3) (3,1) (3,2)
我目前的工具似乎相当昂贵。我该如何进一步优化呢?
val pairs = list.flatMap { currentElement =>
val clonedList: mutable.ListBuffer[Int] = list.to[ListBuffer]
val currentIndex = list.indexOf(currentElement)
val removedValue = clonedList.remove(currentIndex)
clonedList.map { y =>
(currentElement, y)
}
}
答案 0 :(得分:0)
public function ticket()
{
return $this->belongsTo(RmaTicket::class, 'rma_ticket_id');
}
这里有几个优化。首先,对于第二个循环,我们只遍历列表从当前元素到结尾,将迭代次数除以2。然后我们将对象创建的数量限制到最小(仅创建元组并将其添加到可变的哈希集)。最后,使用hashset,您可以免费处理重复项。另一个优化方法是检查集合是否已包含元组,以避免无关地创建对象。
对于1,000个元素,我的笔记本电脑上只需不到1秒。 7个10k个不同的元素。
请注意,递归地,您可以这样做:
val l = Array(1,2,3,4)
val result = scala.collection.mutable.HashSet[(Int, Int)]()
for(i <- 0 until l.size) {
for(j<- (i+1) until l.size) {
result += l(i)->l(j)
result += l(j)->l(i)
}
}
1000个元素需要1点多一点。
答案 1 :(得分:-1)
假设“最佳方式”可以区别对待(例如,大部分时间我将其视为允许我自己更高效的方式)我建议采用以下方法:
val originalList = (1 to 1000) toStream
def orderedPairs[T](list: Stream[T]) = list.combinations(2).map( p => (p(0), p(1)) ).toStream
val pairs = orderedPairs(originalList) ++ orderedPairs(originalList.reverse)
println(pairs.slice(0, 1000).toList)