如何在Java中获取有效的子列表?

时间:2011-05-31 15:11:40

标签: java arraylist sublist

我在Java中有这个奇怪的(我认为)问题。 我有一个ArrayList,我想要一个子列表。 但我得到了以下例外。

package javatest;

import java.util.ArrayList;

public class JavaTest {

    public static void main(String[] args) {
        ArrayList<Integer> alist = new ArrayList<Integer>();
        alist.add(10);
        alist.add(20);
        alist.add(30);
        alist.add(40);
        alist.add(50);
        alist.add(60);
        alist.add(70);
        alist.add(80);
        ArrayList<Integer> sub = (ArrayList<Integer>) alist.subList(2, 4);
        for (Integer i : sub)
            System.out.println(i);
    }
}
  

运行:线程“main”中的异常   java.lang.ClassCastException:   java.util.RandomAccessSubList不能   被转换为java.util.ArrayList at   javatest.JavaTest.main(JavaTest.java:17)   Java结果:1

获取子列表的正确方法是什么?

THX

6 个答案:

答案 0 :(得分:46)

将其设为:

List sublist = new ArrayList();
sublist = new ArrayList<String>(alist.subList(2, 4));

它应该有效

答案 1 :(得分:24)

您应该尽可能使用集合的接口。您正在向下转发子列表的结果,但API指定它返回List ArrayList)。在这里,实现者选择返回不同类型以使他们的生活更轻松。

此外,API文档指定子列表将返回映射到原始列表的List,所以要小心!

答案 2 :(得分:8)

试试这个......

List<Integer> alist = new ArrayList<Integer>();
alist.add(10);
alist.add(20);
alist.add(30);
alist.add(40);
alist.add(50);
alist.add(60);
alist.add(70);
alist.add(80);
List<Integer> sub = alist.subList(2, 4);
for (Integer i : sub)
  System.out.println(i);

答案 3 :(得分:3)

尝试

List<Integer> sub = alist.subList(2, 4);

答案 4 :(得分:2)

    public List<E> subList(int fromIndex, int toIndex) {
    return (this instanceof RandomAccess ?
            new RandomAccessSubList<E>(this, fromIndex, toIndex) :
            new SubList<E>(this, fromIndex, toIndex));
    }
像在ArrayList的impl一样,它是返回List,正如@George Kastrinis所说的那样 尽可能的界面。

答案 5 :(得分:0)

将代码更改为:

List<Integer> sub = alist.subList(2, 4);

sublist()方法返回List,不一定是ArrayList(这里实际上是RandomAccessSublist,这就是演员失败的原因。)