Используя параллельные коллекции,
def parRevZip (a: List[String], b: List[Int]) = {
val max = Math.max(a.size, b.size)
val n = Math.abs(a.size - b.size)
if (a.size > b.size)
(max to n+1 by -1).par.map { i => (a(i-1), b(i-n-1)) }
else
(max to n+1 by -1).par.map { i => (a(i-n-1), b(i-1)) }
}
Принимая во внимание разные значения индекса для списков, возможно, разного размера, этот подход выбирает и объединяет одинаковое количество элементов, начиная с конца каждого списка.
Производительность требует тщательной оценки; для небольших списков простой реверс и сжатие могут оказаться намного проще и эффективнее; наоборот, для больших списков этот параллельный подход может быть интересен.
Уточнение кода
def parRevZip[A,B] (a: List[A], b: List[B]) = {
val aSize = a.size
val bSize = b.size
val max = Math.max(aSize, bSize)
val n = Math.abs(aSize - bSize)
if (aSize > bSize)
(max-1 to n by -1).par.map { i => (a(i), b(i-n)) }
else
(max-1 to n by -1).par.map { i => (a(i-n), b(i)) }
}
Использование нерекурсивных коллекций
Удобные неизменяемые коллекции здесь, где вычисление размера равно O(1)
(или квазипостоянному) (см. Рекурсивные коллекции в Scala, такие как List ) включают, например, Array. Следовательно,
def parRevZip[A,B] (a: Array[A], b: Array[B])
что не соответствует дальнейшему требованию обработки списков.
person
elm
schedule
30.01.2014
(a, ?)
? - person om-nom-nom   schedule 30.01.2014List('a', 'b', 'c').reverse zip List(1,2).reverse
. Думаю, вы сами ответили на свой вопрос. - person Brian   schedule 30.01.2014