Как сделать что-то подобное в Scala? - PullRequest
1 голос
/ 01 октября 2009

Извините за отсутствие описательного заголовка; Я не мог придумать ничего лучше. Отредактируйте его, если подумаете.

Допустим, у меня есть два List объекта, и они всегда меняются. Они должны оставаться в виде отдельных списков, но для обоих из них необходимо выполнить много операций. Это заставляет меня делать такие вещи, как:

//assuming A and B are the lists
A.foo(params)
B.foo(params)

Другими словами, я делаю одну и ту же операцию для двух разных списков в разных местах моего кода. Я хотел бы, чтобы сократить их до одного списка без явного создания другого списка. Я знаю, что простое объединение списков A и b в список C решит все мои проблемы, но тогда мы просто вернемся к той же операции, если мне понадобится добавить новый объект в список (потому что Я должен был бы добавить это к C, а также к соответствующему списку).

Он в узком кругу, и производительность очень важна. Есть ли способ создать итератор или что-то такое, что итерирует A, а затем переходит к B, все прозрачно? Я знаю, что другим решением было бы создание комбинированного списка (C) каждый раз, когда я хотел бы выполнить какую-то функцию в обоих этих списках, но это огромная трата времени (вычислительно говоря).

Ответы [ 2 ]

4 голосов
/ 01 октября 2009

Итератор - это то, что вам нужно здесь. Превращение списка в итератор и объединение двух итераторов - обе операции O (1).

scala> val l1 = List(1, 2, 3)
l1: List[Int] = List(1, 2, 3)

scala> val l2 = List(4, 5, 6)
l2: List[Int] = List(4, 5, 6)

scala> (l1.iterator ++ l2.iterator) foreach (println(_)) // use List.elements for Scala 2.7.*
1
2
3
4
5
6
2 голосов
/ 01 октября 2009

Я не уверен, понимаю ли я, что вы имеете в виду. Во всяком случае, это мое решение:

scala> var listA :List[Int] = Nil
listA: List[Int] = List()

scala> var listB :List[Int] = Nil
listB: List[Int] = List()

scala> def dealWith(op : List[Int] => Unit){ op(listA); op(listB) }
dealWith: ((List[Int]) => Unit)Unit

и затем, если вы хотите выполнить оператор в списках listA и listB, вы можете использовать следующее:

scala> listA ::= 1
scala> listB ::= 0
scala> dealWith{ _ foreach println }
1
0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...