1

这就是我现在所拥有的:

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 类中的任何方法。

4

5 回答 5

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);
}
于 2010-10-05T06:05:10.253 回答
0

我假设您必须返回标准的 ArrayList,而不是您自己的 ArrayList 版本,并且我假设“stuff”是一个数组,而不是一个列表。

首先,获得使 ArrayList 具有数组的初始大小(toIndex - fromIndex)的奖励积分。要获得更多奖励积分,请确保“东西”中确实存在往返不雅点,否则你会遇到一个很好的崩溃。

ArrayList 使用内部数组进行存储,您无法更改它,因此您别无选择,只能创建一个副本。

编辑 你可以让事情变得更有趣和更复杂,但它会给人留下深刻印象......通过创建你自己的实现 List 的 ArrayList 类来做到这一点。让它使用原始数组。相当不稳定,因为如果该数组在外部其他地方被修改,你就有麻烦了,但它可能很有趣。

于 2010-10-05T05:54:34.193 回答
0

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

如果这不是您的目标,您将不得不在某个时候创建​​一个新列表来保存子列表。

于 2010-10-05T05:59:25.570 回答
0

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

于 2010-10-05T06:02:30.447 回答
0

子列表是“一个新列表”,因此您必须创建一些东西来表示数组的子列表。这可以是新数组或列表。您选择了一个对我来说看起来不错的 ArrayList。您没有(直接)创建一个新数组,所以我实际上并没有得到您的问题的这一点。(如果要避免通过 ArrayList间接List创建新数组,请选择其他实现,LinkedList例如)

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

  • 考虑将源数组作为方法参数传递。现在stuff[]是一个静态字段。
  • toList-fromList+1考虑使用子列表 ( )的大小初始化新的 ArrayList
  • 考虑使用泛型(仅当您现在已经有了这个概念时)。所以返回类型是ArrayList<String>
于 2010-10-05T06:03:29.080 回答