2015-06-12 5 views
1

С учетом var x: Array[Seq[Any]], какой был бы самый эффективный (быстрый, на месте, если возможно?) Способ удалить первый элемент из каждой строки?Scala: удалить первый столбец (первый элемент в каждой строке)

Я попытался следующие, но это не сработало - вероятно, из-за неизменности ...

for (row <- x.indices) 
    x(row).drop(1) 

ответ

2

Во-первых, Array s изменчивы, и Я предполагаю, что вы намерены изменить элементыx, вместо того чтобы заменить весь массив новым объектом массива, поэтому имеет смысл использовать val вместо var:

val x: Array[Seq[Any]] 

Так как вы сказали, что ваши Seq объекты неизменны, то вам необходимо убедиться, что вы установки значения в массиве. Это будет работать:

for (row <- x.indices) 
    x(row) = x(row).drop(1) 

Это может быть написано красивее. Например, вы можете использовать transform отобразить все значения вашего массива с помощью функции:

x.transform(_.drop(1)) 

Это обновления в месте, в отличие от map, который оставит старый массив без изменений и возвращает новый массив.

EDIT: Я начал размышлять над тем, какой метод будет быстрее или эффективнее, но чем больше я думаю об этом, тем больше понимаю, что не уверен. Оба варианта должны иметь приемлемую производительность для большинства случаев использования.

+0

приятный, очень всеобъемлющий и образовательный - спасибо за этот ответ –

+0

в качестве последующего вопроса, если вы не возражаете - если 'transform (...)' изменяет элементы на месте, то как это работает для 'val'? Есть ли эквивалент для 'transform (...)', но для 1D массива или seq? –

+1

, которая оставит старый массив без изменений и вернет новый массив, но новый массив и старый массив будут использовать одни и те же элементы, поэтому неизменяемые структуры данных так важны. –

1

это будет работать

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

scala> x map(_.drop(1)) 
res0: Array[List[Int]] = Array(List(2, 3), List(2, 3)) 
+0

good catch, thanks –

Смежные вопросы