【问题标题】:Append String to native Java array将字符串附加到本机 Java 数组
【发布时间】:2015-01-22 23:49:03
【问题描述】:

有没有更优雅的方法(最好在 SDK 中),它会采用现有的 N 个 String 对象数组并附加另一个 String 以便该数组现在有 N+1 个 String 对象?请看下面我是如何做到的。

import java.util.Arrays;

public class StringArrayAppend {

/**
 * @param args
 */
public static void main(String[] args) {
    String[] selectionArgs={"3","2"};
    //Is there a SDK method to Arrays.append(selectionArgs,"1");?


    int newSize=selectionArgs.length+1;
    int indexNewElem=selectionArgs.length;
    String[] selectionArgs2=new String[newSize];
    System.arraycopy(selectionArgs, 0, selectionArgs2, 0, selectionArgs.length);
    selectionArgs2[indexNewElem]="1";
    selectionArgs=selectionArgs2;
    selectionArgs2=null;

    System.out.println("selectionArgs="+Arrays.toString(selectionArgs));


}

}

【问题讨论】:

    标签: java arrays string append native


    【解决方案1】:

    恐怕JDK中什么都没有。

    您可以引入 Commons Lang,或者自己创建一个辅助方法(就像您当前代码中的那个)。

    您可以通过使用Arrays#copyOf 稍微简化代码(它允许副本比原始元素长一个)。

    不管你怎么做,你最终都会得到一个新的数组。由于数组无法调整大小,所以没有其他办法。

    【讨论】:

    • 感谢您的意见。不知道 copyOf 存在。
    【解决方案2】:

    如果你坚持使用 Java 数组,我不知道有一种优雅的方式将一个数组附加到另​​一个数组上,而不是像你所做的那样(创建另一个大小正确的数组,然后简单地将新元素添加到数组的末尾)。

    编辑:我找到了使用 Apache Commons Lang Library ArrayUtils.addAll(T[], T...) 的单线解决方案

    String[] both = ArrayUtils.addAll(first, second);
    

    使用 ArrayList 怎么样? ArrayList 是动态调整大小的,可以让您简单地添加元素(使用 ArrayList.add(Object o))。

    【讨论】:

      【解决方案3】:

      据我所知,除了将您的数组转换为列表或从列表转换之外,JDK 中没有任何内容可以使此操作更容易。如果你不介意拉入Google's Guava library,可以使用它的ObjectArrays.concat() 方法。

      使用示例代码中的值,它看起来像这样:

      String[] selectionArgs = {"3", "2"};
      selectionArgs = ObjectArrays.concat(selectionArgs, "1");
      

      【讨论】:

        【解决方案4】:

        您可以分三行完成,但总体效率将是相同的:

        String[] a = new String[] {"quick", "brown", "fox"};
        
        List<String> s = new ArrayList<String>(Arrays.asList(a));
        s.add("jumps");
        a = s.toArray(new String[s.size()]);
        
        System.out.println(Arrays.toString(a));
        

        Demo.

        但是,当您需要容器可扩展性时,最好的方法是使用ArrayList&lt;String&gt;

        【讨论】:

        • 啊,这就是我要找的。我之前确实用 asList(...) 尝试过,但不知道如何解决投射错误。谢谢!
        • 但请注意,这实际上会复制您的数组的三个副本(而 OP 代码只有一个):在 ArrayList 构造函数中,添加第二个副本(因为需要扩展容量),以及调用 toArray 时的三分之一。
        猜你喜欢
        • 1970-01-01
        • 2018-07-24
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        • 2016-03-02
        • 2013-01-04
        • 2015-11-12
        相关资源
        最近更新 更多