如何向Varargs添加新元素?

12

我有一个方法

public boolean findANDsetText  (String Description, String ... extra ) {

我希望在其中调用另一个方法并将其extras传递给它,但我想要向extras添加新元素(Description)。

     object_for_text = getObject(find_arguments,extra);

我该如何在java中实现这一点?代码会是什么样子?

我试着用这个问题里的代码,但无法使其工作。


1
可能是一个重复问题,参考链接:如何从可变参数方法中调用带有附加参数的可变参数方法 - Raedwald
7个回答

13
为了进一步解释其他回答,可以使用以下代码更快地复制数组:
String[] newArr = new String[extra.length + 1];
System.arraycopy(extra, 0, newArr, 0, extra.length);
newArr[extra.length] = Description;

5

使用 Arrays.copyOf(...)

String[] extra2 = Arrays.copyOf(extra, extra.length+1);
extra2[extra.length] = description;

object_for_text = getObject(find_arguments,extra2);

2

extra 只是一个 String 数组。因此:

List<String> extrasList = Arrays.asList(extra);
extrasList.add(description);
getObject(find_arguments, extrasList.toArray());

您可能需要处理extrasList.toArray()的通用类型。

您可以更快,但更冗长:

String[] extraWithDescription = new String[extra.length + 1];
int i = 0;
for(; i < extra.length; ++i) {
  extraWithDescription[i] = extra[i];
}
extraWithDescription[i] = description;
getObject(find_arguments, extraWithDescription);

1
我在第一个选项中遇到了“无法在String[]数组类型上调用asList()”的错误。 - Radek
你是不是想使用 Arrays.asList(extra)?(请参考Radek的评论) - Greg Kopff
现在我得到了“无法在原始类型布尔上调用toArray()”的错误,因为我执行了Arrays.asList(extra).add(Description).toArray() - Radek
将会出现 ArrayIndexOutOfBoundsException - Raedwald
4
这个代码(在Java 8u144中测试过)将不再起作用,因为Arrays.asList()返回的是一个固定大小的列表。建议使用Arrays.copyOf(...)代替。 - lenborje

1
你是指像这样的东西吗?
public boolean findANDsetText(String description, String ... extra)
{
    String[] newArr = new String[extra.length + 1];
    int counter = 0;
    for(String s : extra) newArr[counter++] = s;
    newArr[counter] = description;

    // ...

    Foo object_for_text = getObject(find_arguments, newArr);

    // ...
}

0

使用实用函数将数组转换为列表,然后再转回数组,但更短:

// import com.google.common.collect.Lists;

var descriptionAndExtra
    = Lists.asList(description, extra).toArray(new String[extra.length + 1]));

0

就是这样简单...

按照以下方式处理可变参数...

示例:

在您上面的示例中,第二个参数是“String... extra”

因此,您可以像这样使用:

extra[0] = "Vivek";
extra[1] = "Hello";

或者

for (int i=0 ; i<extra.length ; i++)

  {

          extra[i] = value;

  }

0

使用Java 11作为新List的参数:

List<String> templateArguments = new ArrayList<(Arrays.asList(args));
templateArguments.add(throwable.getMessage());
String.format(template, templateArguments.toArray());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接