如何动态地向Java数组添加项目?


85

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

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

之后,$x将是一个像这样的数组:{1,2}

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


4
对于以下所有答案,请使用ArrayList,但OP专门要求Array。我也想知道。
KJYe.Name叶家仁2011年

4
答案是“不”。您必须在Java声明/创建时指定数组的大小(或填充所有元素)。请参阅java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
Ritesh'2

我注意到各种Java函数都返回数组,因此着眼于File.java中list(filter)的实现。它在内部使用List,然后在最后将其转换为数组。List <String> v =新的ArrayList <>(); ... return v.toArray(new String [v.size()]);
xtempore,2015年

Answers:


112

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

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

21
除了一个以外,这是一个完美的答案。通常,在Java中,我们只使用List而不是原始数组,但是对于实际上需要原始数组(例如int[])的实例,只需使用toArray()List上的方法即可。使用上面的代码,但用于x.toArray()获取原始数组。
rharter 2012年

1
如果确实需要原始数组,那么在99%的情况下(更像是99.99999%的情况),您做错了什么,应该使用OO原则进行处理。除非您与本机代码或OracleARRAY对象之类的东西或诸如此类的愚蠢行为打交道,否则最好避免使用原始数组。
corsiKa

11
哦,所有这些关于您不应该使用原始数组的评论,即使只是那么简单:(
thecoshman 2013年

1
@trusktr这就是这样做的原因之一。在此示例中,它更多地类似于...使用List引用使我们ArrayList可以在需要的任何时候踢到路边。如果有人发布了更好的列表,例如SuperDuperAwesomeList,如果我们将参考设为,我们可能需要做很多工作ArrayList。ArrayList具有List所没有的东西。如果我们在代码中依靠这些东西,换掉就变得更加困难。
corsiKa 2013年

1
@corsiKa,编写一些没有基元的压缩/编码算法,这些情况比99.(9)更为常见。Маtrix也会引发尖叫声。值得注意的是,如果您与本机代码交互,则使用DirectBuffers而不是原始数组。最后,如果您对数据库和演示文稿感到困惑,那是可以的,但是99%的声明只是愚蠢的。
bestsss 2014年

64

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)。(一个快速搜索过的示例就是此IntList类。)

番石榴含有制造这种包装方法Ints.asListLongs.asList等等。


它比公认的解决方案聪明得多。没有浪费的物体。
薄雾

2
@Mihail:实际上,我通常不建议这样做,因为对于元素的每次添加都会创建一个新数组,并复制整个内容。(不过,这取决于您的用例-如果您很少添加/删除任何东西,并且经常进行迭代/搜索,那可能就可以了。)
PaŭloEbermann 2011年

较新版本中的ArrayUtils具有执行该操作的方法。我很懒惰地检查实现,但是我很确定他们写的很好。
薄雾

1
@MihailStoynov实际上,这实际上是做什么的ArrayList-除了在每次添加时都不会调整大小之外,当空间用完时它会加倍大小,因此不必经常调整大小。
corsiKa 2012年

1
@Mav不,因为org比短一result
圣保罗Ebermann

19

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)

2
在新的ArrayUtils是:ArrayUtils.appendElement(String.class,origArray, “新元素”)
MARMOR

12

我经常在网络上看到这个问题,我认为许多声誉很高的人没有正确回答这些问题。因此,我想在这里表达自己的答案。

首先,我们应该考虑和之间的区别arrayarraylist

该问题要求将元素添加到array,而不是ArrayList


答案很简单。它可以分3个步骤完成。

  1. 将数组转换为数组列表
  2. 将元素添加到arrayList
  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;
    }

第三步:

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

第四步

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

1
因为最后有人指出了实际数组和ArrayList之间的区别而被
投票

最完整和描述性的答案。
Obaid

11

您可以使用ArrayList,然后再使用toArray()方法。但是根据您的工作,您甚至可能根本不需要数组。查看是否Lists还有您想要的东西。

请参阅:Java列表教程



4

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

此Collection框架将以“ java.util。*”包提供

例如,如果您使用ArrayList,

创建一个对象,然后添加多个元素(任何类型,例如String,Integer ... etc)

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

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

如果要删除任何添加的元素

a.remove("suman");

再次,如果你想添加任何元素

a.add("Gurram");

因此,数组大小是动态增加/减少的。



0

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

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基本数组的原始问题没有任何关系。
乔·戴

0

这是添加到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);
    }

0

在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()));
        }
    }

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.