1

我知道将数组列表转换为数组的代码是:

private String[] arrayLst_to_array(ArrayList<String> al) {
    String[] arr = new String[al.size()];
    arr = al.toArray(arr);
    return arr;
}

但我希望我的新数组在开始时有一个特定的字符串,然后,我想要数组列表的其余部分。

我知道我可以将我想要的字符串添加到数组列表的开头然后转换它,但是有没有更有效的方法?

4

4 回答 4

7

您可以使用System.arraycopy()

String[] arr = new String[al.size() + 1];
arr[0] = someStr;  // initial string

// copy the list:
System.arraycopy(al.toArray(), 0, arr, 1, al.size());

return arr;
于 2013-10-02T14:53:41.353 回答
1

如果您将一个项目添加到列表的开头,则整个列表的内容必须向上移动一个位置。这意味着在整个操作中每个元素都会被触摸两次。如果您将列表导出到一个数组,然后System.arrayCopy在开始时使用为一个腾出空间,那么每个项目都会再次被触摸两次。

只触及每个项目一次的最简单的解决方案似乎是创建数组,添加字符串,然后遍历列表以添加其元素。

String[] arr = new String[al.size() + 1];
arr[0] = someStr;
int i=1;
for (String s: al) {
    arr[i++] = s;
}

这是否比迭代项目两次但受益于效率的方法更快,System.arrayCopy应该由基准测试显示。

于 2013-10-02T15:03:21.493 回答
1

一个内存效率高但性能可能不太好的解决方案是:

public static String[] listPlusOne(final ArrayList<String> list, final String prepend)
{
    final String[] arr = list.toArray(new String[list.size() + 1]);
    System.arraycopy(arr, 0, arr, 1, list.size());
    arr[0] = prepend;
    return arr;
}

此解决方案仅分配一个String数组并执行内存移动,System.arrayCopy()以将所有元素向上移动一个位置。

一般来说,内存移动总是不是最好的解决方案。ALinkedList将允许非常快速的元素前置,但在访问随机位置的元素时具有 O(n) 复杂度。ArrayList前置(内存移动,重新分配)较慢,但在访问元素时具有 O(1) 。

因此,要么使用类似上面的代码,要么将元素添加到列表中。

于 2013-10-02T14:59:56.683 回答
-2

简而言之,对您的问题的回答是否定的。我认为您提供的选项是最好的方法。

于 2013-10-02T14:53:10.067 回答