Scala在集合中查找对的最佳方法

时间:2017-12-12 19:19:40

标签: algorithm scala collections

我试图找到在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)
      }
    }

2 个答案:

答案 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)