Java如何在变量参数数组的开头添加插入元素



我有一个带有字符串列表参数的函数,我想在这个字符串列表参数的开头插入元素,以便我可以将其作为参数传递给其他函数,现在当我尝试添加 ArrayList 但 argArr 没有这样的方法时..

ArrayList.add(0,"foo");

private void A(String... argsArr)
{
   //insert element at beginning
   B(argArr); 
}
private void B(String... argsArr)
{
}

如果要使用变量参数数组,可以创建一个插入元素的新数组。例如,使用流:

private void a(String... argsArr) {
    String[] args2 = Stream.concat(Stream.of("foo"), Arrays.stream(args))
                           .toArray(String[]::new);
    b( args2 );
}

如果您愿意,可以创建一个没有流的新数组。下面是使用临时列表的简单方法。

private void a(String... argsArr) {
    List<String> newList = new ArrayList<>();
    newList.add("foo");
    newList.addAll(Arrays.asList(argsArr));
    b(newList.toArray(new String[newList.size()]));
}

如果不需要变量参数数组,则可以使用 List<> 参数。将新元素插入到不同的列表中是一种很好的形式。调用方可能提供不可修改的列表,或者可能不希望修改其列表。

private void a2( List<String> args ) {
    List<String> newList = new ArrayList<>( args );
    newList.add(0, "foo"); // <-- Extra O(n) time to shift elements over.
    b( newList );
}

您可以通过不在现有列表的开头插入来按常数系数提高效率。

private void a2( List<String> args ) {
    List<String> newList = new ArrayList<>( );
    newList.add("foo"); 
    newList.addAll( args );
    b( newList );
}

String...是一个可变长度数组,而不是一个ArrayList数组,因此add(index,element)在您的argsArr参数上不可用。

你需要写一些逻辑来实现你想要的。下面列出了一种可能性:

private void A(String... argsArr){
   List<String> list = Arrays.stream(argsArr).collect(Collectors.toList());
   list.add(0,"New_Element_To_Be_Added");
   B(list.toArray(new String[list.size()]));
}

只需将数组复制到更大的数组并设置第 0 个索引:

int[] second = new int[args.length + 1];
System.arraycopy(args, 0, second, 1, args.length);
second[0] = val;

因为varargs是一个数组。

相关内容

  • 没有找到相关文章

最新更新