Предположим, что я хочу groupBy
на итераторе, компилятор просит «value groupBy is not a member of Iterator[Int]
». Одним из способов было бы преобразование итератора в список, который я хочу избежать. Я хочу сделать groupBy
таким образом, что вход Iterator[A]
и выход Map[B, Iterator[A]]
. Так, что часть итератора загружается только тогда, когда к этой части элемента обращаются, а не к загрузке всего списка в память. Я также знаю возможный набор ключей, поэтому могу сказать, существует ли конкретный ключ.Как группировать итератор без преобразования его в список в scala?
def groupBy(iter: Iterator[A], f: fun(A)->B): Map[B, Iterator[A]] = {
.........
}
Я бы подумал, что загружается только часть списка, которая необходима для доступа к самому последнему доступному элементу. Только эта часть будет в памяти. – Arun
@Arun, но какой товар дает вам последний доступный элемент?Как и в моем примере, если у вас есть '1 2 3 4 5 6', если вы' groupBy' и хотите получить все нечетные элементы, которые вам нужны, чтобы перебирать все это, даже через четные числа. Если вы загружаете только самый последний элемент, вы в конечном итоге загрузите четное число, и ваш итератор вернет 'false', хотя впереди могут быть нечетные числа. –
жаль, что я думал, что он загружается только при обращении к определенному элементу. Теоретически предположим, что у меня очень небольшое количество ключей (например, 4), и у меня есть огромный список элементов в итераторе. В идеале, если мы заранее знаем ключи, мне нужно будет только получить доступ к первому вступлению каждого известного ключа для создания соответствующего итератора для каждого ключа. Например (2,2,1,1,1,1,2,2,4,2,3, .......) эта часть списка достаточно, если я знаю, что ключи {1,2, 3,4}. После доступа любого элемента мы повторяем аналогичный процесс для загрузки следующего элемента в каждом итераторе. В вашем примере это крайний случай и его ok – Arun