我有以下代码,我想知道这是否是返回数组的正确方法。
我的函数返回Page<byte[]>[]
(一个Page<byte[]>
的数组),并且我使用ArrayList作为容器。
pages是一个私有的HashMap成员。 Page是我创建的具有泛型类型T的成员的对象。
最后我返回使用toArray转换的ArrayList,但是我不能告诉它将它转换为Page数组对象,它需要一个固定的大小(new Page [pageArray.size()])和我认为这不是正确的方法。
什么是正确的方法?
public Page<byte[]>[] getPages(Integer[] pageIds){
ArrayList<Page<byte[]>> pageArray = new ArrayList<Page<byte[]>>();
for (int pageId : pageIds){
if (pages.containsKey(pageId)){
pageArray.add(pages.get(pageId));
}
}
return pageArray.toArray(new Page[pageArray.size()]);
//return pageArray.toArray(Page);
答案 0 :(得分:1)
如果您必须对它们执行此类操作,我无法理解您使用数组而不是列表的原因。
无论如何,你的方法是正确的,并且做了工作。不使用ArrayList
的另一种方法可以是这个:
public Page<byte[]>[] getPages(Integer[] pageIds){
int count = 0;
for (int i=0; i<pageIds.length;i++){
if (pages.containsKey(pageIds[i])){
count++;
pageIds[i] = -1; //BEWARE! this modifies the original pageIds array!
}
}
int retCount = 0;
Page<byte[]>[] ret = new Page<byte[]>[count];
for (int i=0; i<pageIds.length;i++){
if(pageIds[i]!=-1){
ret[retCount] = pages.get(pageIds[i]);
retCount++;
}
}
return ret;
}
但它确实没有为你的方法添加任何东西......
答案 1 :(得分:0)
这应该有效:
@SuppressWarnings("unchecked")
public Page<byte[]>[] getPages(Integer[] pageIds) {
final ArrayList<Page<byte[]>> pageArray = new ArrayList<Page<byte[]>>();
for (int pageId : pageIds) {
if (pages.containsKey(pageId)) {
pageArray.add(pages.get(pageId));
}
}
return pageArray.toArray(new Page[pageArray.size()]);
}
答案 2 :(得分:-1)
我建议使用一个空参数,因为这样你就不会创建任何大的临时对象:
return pageArray.toArray(new Page[0]);
大小取决于pageArray
的大小。