2015-05-14 79 views
6

我有(1,2,3,4,5),并试图获得一个子列表:清单(3,4)它通过以下方式:斯卡拉如何通过指数来获得子列表

List(1 ,2 ,3 ,4 ,5).slice(this.size - 3 , this.size - 1) 

但我得到了一个错误

error: value size is not a member of object 

如何使用Scala中“这个”参数就像在Java中。是否有其他方法来实现这一目标。非常感谢。

+0

为什么要使用'size'? (1,2,3,4,5).slice(2,4)'是否适合你?也算从最后你可以做一行'列表(1,2,3,4,5).reverse.slice(1,3).reverse' – Kolmar

+0

我认为他意味着他也想获得一个子列表从索引到最后一个元素附近的元素,如果他不确切知道列表的大小,那么他必须使用“大小”函数 – nguyenngoc101

+0

作为一般说明,“List”不具有良好的随机性访问性能。如果你正在寻找可以被编入索引的东西,那么'Vector'更适合。 – Martijn

回答

5

你应该首先声明该列表,然后使用其名称参考该列表list而不是this

val list = List(1 ,2 ,3 ,4 ,5) 
list.slice(list.size -3, list.size -1) 

如果你真的想这样做,在一行中,然后用reverse,但它不是非常有效:

List(1 ,2 ,3 ,4 ,5).reverse.slice(1, 3).reverse 

顺便说一句,该代码将不会在Java中有效的两种。 this引用封闭对象,而不是列表。

+0

中的“size”函数来实现。你是对的,但我想找到其他的方式,写在一行。 你有什么想法吗? –

+0

@VietSon是的,使用'reverse'。我已经更新了我的回答 – dcastro

+1

@VietSon,你不能。你需要一个对象来调用'size',唯一的办法就是先将这个对象存储在某个地方。你可以用像无形的kestrel组合器这样的解决方法:'List(1,2,3,4,5)|> {list => list.slice(list.size-3,list.size-1)}'然而这与创建单独的val没有什么不同。我建议保持简单,并以原始形式回答这个问题。 –

3

如果你想要最后3个或n个元素,你可以使用takeRight(3)takeRight(n)。基于问题编辑

编辑:

如果你需要不采取第一f和最后l元素然后

List(1,2,3,....n).drop(f).dropRight(l) 

对于您的情况下,将List(1,2,3,4,5).drop(2).dropRight(1)

+0

不,我也想在中间获取一些元素,不仅左侧或右侧 –

+0

列表(1,2,3,4,5).drop(2)。dropRight(1))没问题,但我想通过使用Scala –

0

的问题是,这不是指向你的列表中,如果你想利用一些参数在列表中使用的中间带和takeRigth请阅读斯卡拉文档末尾的字是一个链接

val my_lst = List(1 ,2 ,3 ,4 ,5) 
my_lst.takeRight(3).take(2) 

my_lst: List[Int] = List(1, 2, 3, 4, 5) 
res0: List[Int] = List(3, 4) 

与指数计算右侧my_lst.size第一takeRight - thepositions,所以你必须编写thepositions,然后你想有多少个元素在新的子列表

这里是如何工作的斯卡拉列表的方法的解释

f ROM Scala的帮助文档

def slice(from: Int, until: Int): List[A]

returns

a list containing the elements greater than or equal to index from extending up to (but not including) index until of this list. 

Definition Classes List → LinearSeqOptimized → IterableLike → TraversableLike → GenTraversableLike Example:

//给定一个列表 VAL字母=列表( 'A', 'B', 'C', 'd', 'E')

// slice返回所有元素index开始from事后, //直到指数until(不包括指数型until。) letters.slice(1,3)//返回列表( 'b', 'C')

你箱使用长度或尺寸

scala> val my_lst = List(1 ,2 ,3 ,4 ,5) 
my_lst: List[Int] = List(1, 2, 3, 4, 5) 

scala> my_lst.slice(my_lst.length-3,my_lst.length) 
res0: List[Int] = List(3, 4, 5) 

但真正的斯卡拉列表类有很多功能,可以适合你。在你的情况,如果你想在最后3个elemments使用takeRight

def takeRight(n: Int): List[A]

Selects last n elements.

n

the number of elements to take returns 

a list consisting only of the last n elements of this list, or else the whole list, if it has less than n elements. 

Definition Classes List → IterableLike

scala> my_lst.takeRight(3) 
res2: List[Int] = List(3, 4, 5) 

在斯卡拉Docs

+0

为什么我得到-1这个答案? – anquegi

+0

对不起,我编辑了这个问题。一般来说,我也希望通过使用Scala中的“size”函数来获取中间的一些元素,不仅仅是左侧或右侧 –

+0

我编辑了我的答案,希望对您有所帮助;-) @VietSon – anquegi

-2

看看你有一个List(1,2,3,4,5)

1)这是一个函数或对象还是一个类?

2)你想从列表(X,X,3,4使用返回值,X)

3)你需要使用尺寸括号外,从你的新列表功能返回值。 ..

4)创建一个函数来完成这个步骤再寄回给一个变量...

5)当你火的功能列表()使用变量与列表(A,B,C,d ,E)

6)所有对象必须在使用前完全声明。例如,你如何使用没有空气的篮球?或者如何使用足球而不被猪皮覆盖?或者如何在没有CPU的情况下使用电脑?对象的所有组件必须完全声明并在编程中正常工作!

7)List()函数中的所有数据,函数,对象必须正常工作或...正常工作。 。 。

8)你说:“总的来说,我也想在中间的一些元素” ..

9)作为一个老程序员......你要知道确切位置的元素在你的名单( )功能

10)从一开始,在您希望“使用”所有这些功能之前,您必须在您的程序开头加载您使用的所有功能的类。

11)你不能像使用对象或类一样使用函数!

12)最后,你只是想要有创造性当编程语言设置的规则或界限...... Scala是不是Java ...

这是否帮助?与“错误:值大小不是对象的成员”