【问题标题】:How to add an element at the end of an array?如何在数组末尾添加元素?
【发布时间】:2015-04-17 10:33:22
【问题描述】:

我想知道如何在数组末尾添加或追加新元素。有什么简单的方法可以在最后添加元素吗?我知道如何使用 StringBuffer,但我不知道如何使用它在数组中添加元素。我更喜欢没有 ArrayList 或列表。我想知道 StringBuffer 是否适用于整数。

【问题讨论】:

  • 数组是固定长度的。如果您想在末尾添加项目,请使用可扩展的内容,例如 List
  • 或者每次添加东西时创建一个新数组。
  • ArrayList 之于数组就像StringBuffer 之于String。如果你想追加元素并得到一个数组而不是String,那么你确实想使用ArrayList

标签: java arrays append stringbuffer


【解决方案1】:

您不能将元素添加到数组中,因为数组在 Java 中是固定长度的。但是,您可以使用 Arrays.copyOf(array, size) 从现有数组构建一个新数组:

public static void main(String[] args) {
    int[] array = new int[] {1, 2, 3};
    System.out.println(Arrays.toString(array));
    array = Arrays.copyOf(array, array.length + 1); //create new array from old array and allocate one more element
    array[array.length - 1] = 4;
    System.out.println(Arrays.toString(array));
}

我仍然建议放弃使用数组并使用List

【讨论】:

    【解决方案2】:

    Java 中的数组具有固定长度,无法更改。因此,Java 提供了允许您维护可变长度列表的类。

    一般有List<T>接口,它代表T类的实例列表。最简单和最广泛使用的实现是ArrayList。这是一个例子:

    List<String> words = new ArrayList<String>();
    words.add("Hello");
    words.add("World");
    words.add("!");
    

    List.add() 只是将一个元素附加到列表中,您可以使用List.size() 获取列表的大小。

    【讨论】:

    • 当您确实需要对象数组时,List 类具有 toArray()toArray(T[] t)...
    【解决方案3】:

    OP 说,出于未知原因,“我更喜欢没有数组列表或列表。”

    如果您所指的类型是原始类型(您提到整数,但没有说您的意思是 int 还是 Integer),那么您可以使用 NIO Buffer 类之一,例如 java.nio.IntBuffer .这些行为很像StringBuffer 所做的 - 它们充当原始类型列表的缓冲区(所有原始类型都存在缓冲区,但对象不存在),您可以将缓冲区包装在数组周围和/或从中提取数组一个缓冲区。

    请注意,javadocs 说,“缓冲区的容量永远不会是负数,也永远不会改变。”它仍然只是一个数组的包装器,但使用起来更好。有效扩展缓冲区的唯一方法是allocate() 一个更大的缓冲区,然后使用put() 将旧缓冲区转储到新缓冲区。

    如果它不是原始的,您可能应该只使用List,或者想出一个令人信服的理由说明您不能或不会,也许有人会帮助您解决它。

    【讨论】:

      【解决方案4】:

      正如许多其他人指出的那样,如果您尝试在列表末尾添加一个新元素,那么类似 array[array.length-1]=x;应该做。但这将替换现有元素。

      对于像连续添加到数组这样的东西。您可以跟踪索引并继续添加元素,直到到达末尾,并让执行添加的函数返回下一个索引,这反过来会告诉您数组中可以容纳多少元素。

      当然,在这两种情况下,数组的大小都是预先定义好的。 Vector 可以是您的另一个选择,因为您不想要 arraylist,这将允许您使用所有相同的特性和功能,并且还会负责增加大小。

      来到您希望 StringBuffer 排列的部分。我相信您正在寻找的是 getChars(int srcBegin, int srcEnd,char[] dst,int dstBegin) 方法。看看它可能会解决你的疑惑。我想再次指出,在设法从中取出一个数组后,您仍然只能替换最后一个现有元素(在这种情况下为字符)。

      【讨论】:

        【解决方案5】:

        为了澄清术语正确:数组是固定长度的结构(并且现有的长度不能更改)表达式 add at the end 是没有意义的(本身)。

        你可以做的是创建一个大一个元素的新数组,并在最后一个槽中填充新元素:

        public static int[] append(int[] array, int value) {
             int[] result = Arrays.copyOf(array, array.length + 1);
             result[result.length - 1] = value;
             return result;
        }
        

        这很快就会变得低效,因为每次调用 append 时都会创建一个新数组并复制旧数组内容。

        显着减少开销的一种方法是创建一个更大的数组并跟踪它实际填充到哪个索引。添加元素就像填充下一个索引并增加索引一样简单。如果数组完全填满,则会创建一个具有更多可用空间的新数组。

        猜猜 ArrayList 做了什么:正是如此。所以当需要动态大小的数组时,ArrayList 是一个不错的选择。不要重新发明轮子。

        【讨论】:

          【解决方案6】:

          单线带流

          Stream.concat(Arrays.stream( array ), Stream.of( newElement )).toArray();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-07-15
            • 2019-07-11
            • 2018-01-12
            • 2011-01-17
            • 1970-01-01
            • 2023-03-21
            • 2017-09-18
            相关资源
            最近更新 更多