这就是我现在所拥有的:
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类中的任何方法。
答案 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<String>