【问题标题】:How can I dynamically add items to a Java array?如何将项目动态添加到 Java 数组?
【发布时间】:2011-07-01 00:13:05
【问题描述】:

在 PHP 中,您可以通过以下方式向数组动态添加元素:

$x = new Array();
$x[] = 1;
$x[] = 2;

在此之后,$x 将是这样的数组:{1,2}

有没有办法在 Java 中做类似的事情?

【问题讨论】:

  • 以下所有答案都使用 ArrayList,但 OP 专门要求使用 Array。我也想知道。
  • 答案是“否”。您必须在 Java 中声明/创建时指定数组的大小(或填充所有元素)。请看java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
  • 注意到各种Java函数返回数组,于是看了一下File.java中list(filter)的实现。它在内部使用 List ,然后在最后将其转换为数组。列表 v = new ArrayList(); ... return v.toArray(new String[v.size()]);

标签: java arrays dynamic-arrays


【解决方案1】:

查看 java.util.LinkedList 或 java.util.ArrayList

List<Integer> x = new ArrayList<Integer>();
x.add(1);
x.add(2);

【讨论】:

  • 这是一个完美的答案,除了一件。通常在 Java 中我们只使用 List 而不是原始数组,但对于您实际需要原始数组的情况(如 int[]),只需在 List 上使用 toArray() 方法。使用上面的代码,但使用x.toArray() 来获取原始数组。
  • 在 99% 的情况下(更像是 99.99999% 的情况),如果您确实需要一个原始数组,那么您做错了,应该按照 OO 原则来处理。除非您要与本机代码或 Oracle ARRAY 对象之类的东西或类似的愚蠢行为进行交互,否则最好避免使用原始数组。
  • 哦,所有这些关于你不应该如何使用原始数组的问题,只要它这么简单:(
  • @trusktr 这是这样做的原因之一。在这个例子中,它更像是......使用List 引用让我们可以随时将ArrayList 踢到路边。如果有人发布了一个更好的列表,比如SuperDuperAwesomeList,如果我们将引用设为ArrayList,我们可能还有很多工作要做。 ArrayList 有 List 没有的东西。如果我们在代码中依赖这些东西,那么换出就会变得更加困难。
  • @corsiKa,编写一些没有原语的压缩/编码算法,这些情况比 99.(9) 更常见。 Маtrix impls 也包含尖叫原始语。顺便说一句,如果您与本机代码交互,则使用 DirectBuffers 而不是原始数组。最终还是有人不得不硬着头皮,如果你被数据库和演示困住了,没关系,但 99% 的说法只是愚蠢的。
【解决方案2】:

Java 中的数组具有固定大小,因此您不能像在 PHP 中那样“在末尾添加一些内容”。

有点类似于 PHP 的行为是这样的:

int[] addElement(int[] org, int added) {
    int[] result = Arrays.copyOf(org, org.length +1);
    result[org.length] = added;
    return result;
}

然后你可以写:

x = new int[0];
x = addElement(x, 1);
x = addElement(x, 2);

System.out.println(Arrays.toString(x));

但是这种方案对于较大的数组来说效率极低,因为它每次都会复制整个数组。 (实际上它并不完全等同于 PHP,因为您的旧数组保持不变)。

PHP 数组实际上与添加了“最大键”的 Java HashMap 非常相似,因此它会知道接下来要使用哪个键,以及奇怪的迭代顺序(以及整数键和某些键之间的奇怪等价关系)弦)。但是对于简单的索引集合,最好使用 Java 中的 List,就像其他回答者建议的那样。

如果您想避免使用 List 因为将每个 int 包装在 Integer 中的开销,请考虑对原始类型使用集合的重新实现,它在内部使用数组,但不会对每次更改都进行复制,仅当内部数组已满(就像 ArrayList 一样)。 (一个快速谷歌搜索的例子是this IntList class。)

Guava 在Ints.asListLongs.asList 等中包含methods creating such wrappers

【讨论】:

  • 它比公认的解决方案要聪明得多。没有浪费的物品。
  • @Mihail:实际上,我通常不建议这样做,因为每次添加一个元素都会创建一个新数组并复制整个内容。 (不过,这取决于您的用例 - 如果您很少添加/删除任何内容,并且经常迭代/搜索,那可能没问题。)
  • 较新版本中的 ArrayUtils 具有执行此操作的方法。我很懒惰检查实现,但我很确定他们写得很好。
  • @MihailStoynov 实际上,这基本上是 ArrayList 所做的 - 除了不是在每次添加时调整大小,当它用完空间时它的大小会加倍,因此它不必调整大小接近经常。
  • @Mav 不,因为orgresult 短一个。
【解决方案3】:

Apache Commons 有一个 ArrayUtils 实现来在新数组的末尾添加一个元素:

/** Copies the given array and adds the given element at the end of the new array. */
public static <T> T[] add(T[] array, T element)

【讨论】:

  • 在较新的 ArrayUtils 中是:ArrayUtils.appendElement(String.class, origArray, "new element")
【解决方案4】:

我在网络上经常看到这个问题,在我看来,许多享有盛誉的人没有正确回答这些问题。所以我想在这里表达我自己的答案。

首先我们应该考虑在arrayarraylist之间有一个difference

问题要求将元素添加到数组,而不是ArrayList


答案很简单。分三步完成。

  1. 将数组转换为数组列表
  2. 向数组列表添加元素
  3. 将新的arrayList转换回数组

这是它的简单图片

最后是代码:

第 1 步:

public List<String> convertArrayToList(String[] array){
        List<String> stringList = new ArrayList<String>(Arrays.asList(array));
        return stringList;
    }

第 2 步:

public  List<String> addToList(String element,List<String> list){

            list.add(element);
            return list;
    }

第 3 步:

public String[] convertListToArray(List<String> list){
           String[] ins = (String[])list.toArray(new String[list.size()]);
           return ins;
    } 

第 4 步

public String[] addNewItemToArray(String element,String [] array){
        List<String> list = convertArrayToList(array);
        list= addToList(element,list);
        return  convertListToArray(list);
}

【讨论】:

  • 赞成,因为终于有人指出了实际数组和 ArrayList 之间的区别...
  • 最完整和描述性的答案。
【解决方案5】:

您可以使用ArrayList,然后使用toArray() 方法。但是根据你在做什么,你甚至可能根本不需要一个数组。看看Lists 是否更符合您的要求。

见:Java List Tutorial

【讨论】:

    【解决方案6】:

    您可能希望为此使用 ArrayList —— 用于动态大小的数组结构。

    【讨论】:

      【解决方案7】:

      您可以使用 JAVA 中的集合框架将元素动态添加到数组中。集合框架不适用于原始数据类型。

      此 Collection 框架将在“java.util.*”包中提供

      例如如果你使用 ArrayList,

      为其创建一个对象,然后添加多个元素(任何类型,如字符串、整数......等)

      ArrayList a = new ArrayList();
      a.add("suman");
      a.add(new Integer(3));
      a.add("gurram");
      

      现在您已将 3 个元素添加到数组中。

      如果你想删除任何添加的元素

      a.remove("suman");
      

      如果您想添加任何元素,请再次声明

      a.add("Gurram");
      

      所以数组大小是动态增加/减少的..

      【讨论】:

        【解决方案8】:

        使用 ArrayList 或调整数组来自动增加数组大小。

        【讨论】:

          【解决方案9】:

          记录你在原始数组中的位置

          class recordStuff extends Thread
          {
              double[] aListOfDoubles;
              int i = 0;
          
              void run()
              {
                  double newData;
                  newData = getNewData(); // gets data from somewhere
          
                  aListofDoubles[i] = newData; // adds it to the primitive array of doubles
                  i++ // increments the counter for the next pass
          
                  System.out.println("mode: " + doStuff());
              }
          
              void doStuff()
              {
                  // Calculate the mode of the double[] array
          
                  for (int i = 0; i < aListOfDoubles.length; i++) 
                  {
                      int count = 0;
                      for (int j = 0; j < aListOfDoubles.length; j++)
                      {
                          if (a[j] == a[i]) count++;
                      }
                      if (count > maxCount) 
                      {
                          maxCount = count;
                          maxValue = aListOfDoubles[i];
                      }
                  }
                  return maxValue;
              }
          }
          

          【讨论】:

          • 这与最初的问题没有任何关系,即是否可以将新项目动态附加到 Java 原始数组中。
          【解决方案10】:

          这是在java中添加到数组的一种简单方法。我使用第二个数组来存储我的原始数组,然后再添加一个元素。之后,我将该数组传回原来的数组。

              int [] test = {12,22,33};
              int [] test2= new int[test.length+1];
              int m=5;int mz=0;
              for ( int test3: test)        
              {          
              test2[mz]=test3; mz++;        
              } 
              test2[mz++]=m;
              test=test2;
          
              for ( int test3: test)
          
              {
                System.out.println(test3);
              }
          

          【讨论】:

            【解决方案11】:

            在 Java 中,数组的大小是固定的,但您可以使用其索引和 for 循环将元素动态添加到固定大小的数组。请在下面找到示例。

            package simplejava;
            
            import java.util.Arrays;
            
            /**
             *
             * @author sashant
             */
            public class SimpleJava {
            
                /**
                 * @param args the command line arguments
                 */
                public static void main(String[] args) {
                    // TODO code application logic here
            
                    try{
                        String[] transactions;
                        transactions = new String[10];
            
                        for(int i = 0; i < transactions.length; i++){
                            transactions[i] = "transaction - "+Integer.toString(i);            
                        }
            
                        System.out.println(Arrays.toString(transactions));
            
                    }catch(Exception exc){
                        System.out.println(exc.getMessage());
                        System.out.println(Arrays.toString(exc.getStackTrace()));
                    }
                }
            
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-11-16
              相关资源
              最近更新 更多