如何在不使用java中的子列表方法的情况下获取子列表

时间:2010-10-05 05:44:48

标签: java sublist

这就是我现在所拥有的:

public ArrayList subList(int fromIndex, int toIndex){
      ArrayList a = new ArrayList();
      for (int i=fromIndex;i<toIndex;i++) {
          a.add(stuff[i]); //stuff is a array of strings
      }
    return list;
  }

但是可以在不创建新数组的情况下返回子列表吗?我限制使用Array / ArrayList类中的任何方法。

5 个答案:

答案 0 :(得分:2)

如果您想要与Java subList方法具有相同的行为,则需要保留指向原始列表的指针,并使用偏移量和长度来索引到原始列表。

开始显示get方法的实现。

public class SubList extends AbstractList {
    private final List original;
    private final int from;
    private final int to;
    public SubList(List original, int from, int to) {
        this.original = original;
        this.from = from;
        this.to = to;
    }

    public Object get(int i) {
        if (i < 0 || i > to - from) {
            throw new IllegalArguementException();
        }

        return original.get(from + i);
    }
}

public static List subList(List original, int from, int to) {
    return new SubList(original, from, to);
}

答案 1 :(得分:0)

我假设你必须返回标准的ArrayList,而不是你自己的ArrayList版本,我假设'stuff'是一个数组,而不是列表。

首先,获得奖励积分,使ArrayList具有数组的初始大小(toIndex - fromIndex)。要获得更多奖励积分,请确保“东西”中的来往和来自实际存在,否则您将获得良好的崩溃。

ArrayList使用内部数组进行存储,您无法对其进行更改,因此除了创建副本之外别无选择。

修改的 你可以让事情感兴趣并且复杂得多,但它会给某人留下深刻的印象......通过创建你自己的实现List的ArrayList类来做到这一点。让它使用原始数组。非常不稳定,因为如果该阵列在外部的其他地方被修改,你就会遇到麻烦,但它可能很有趣。

答案 2 :(得分:0)

为避免为存储创建新列表,您必须传入对原始列表的引用,保留子列表,然后从列表中删除其余项目,但这会使列表缺少其他项目。

如果这不是您的目标,您必须在某个时刻创建一个新列表来保存子列表。

答案 3 :(得分:0)

你可以回归三件明智的事情。数组,List或迭代器。如果我假设您应该重新实现subList是正确的,那么就无法创建新的ArrayList。

答案 4 :(得分:0)

子列表是“新列表”,因此您必须创建一些代表数组子列表的内容。这可以是新数组或列表。你选择了一个看起来不错的ArrayList。你没有创建一个新的数组(直接),所以我实际上并没有得到你的问题。 (如果您想避免通过ArrayList创建一个新的间接阵列,请选择另一个List实现,例如LinkedList

如果您正在寻找轻微的改进:

  • 考虑将源数组作为方法参数传递。现在stuff[]是一个静态字段。
  • 考虑使用子列表(toList-fromList+1
  • 的大小初始化新的ArrayList
  • 考虑使用泛型(只有你现在已经有了这个概念)。因此返回类型为ArrayList<String>