加入Java中的两个数组? [重复]

问题描述 投票:14回答:7

可能重复:How to concatenate two arrays in Java?

我有两个对象

HealthMessage[] healthMessages1;
HealthMessage[] healthMessages2;

HealthMessage[] healthMessagesAll;

healthMessages1 = x.getHealth( );   
healthMessages2 = y.getHealth( );

我应该如何连接两个对象,所以我只能返回一个:

return healthMessagesAll;

推荐的方法是什么?

java
7个回答
33
投票

使用Apache Commons Collections API是一种好方法:

healthMessagesAll = ArrayUtils.addAll(healthMessages1,healthMessages2);

20
投票

我分配了一个数组,它们的总长度为healthMessages1healthMessages2,并使用System.arraycopy或两个for循环复制其内容。这是带有System.arraycopy的示例:

public class HelloWorld {

     public static void main(String []args) {

        int[] a = new int[] { 1, 2, 3};
        int[] b = new int[] { 3, 4, 5};
        int[] r = new int[a.length + b.length];
        System.arraycopy(a, 0, r, 0, a.length);
        System.arraycopy(b, 0, r, a.length, b.length);

        // prints 1, 2, 3, 4, 5 on sep. lines
        for(int x : r) {
            System.out.println(x);
        }            
     }         
}

13
投票

这样写起来更加直观,您不必处理数组索引:

Collection<HealthMessage> collection = new ArrayList<HealthMessage>();
collection.addAll(Arrays.asList(healthMessages1));
collection.addAll(Arrays.asList(healthMessages2));

HealthMessage[] healthMessagesAll = collection.toArray(new HealthMessage[] {});

..但不要问我与System.arraycopy相对的性能。


3
投票

我会选择System.arraycopy

private static HealthMessage[] join(HealthMessage[] healthMessages1, HealthMessage[] healthMessages2)
{
    HealthMessage[] healthMessagesAll = new HealthMessage[healthMessages1.length + healthMessages2.length];

    System.arraycopy(healthMessages1, 0, healthMessagesAll, 0, healthMessages1.length);
    System.arraycopy(healthMessages2, 0, healthMessagesAll, healthMessages1.length, healthMessages2.length);

    return healthMessagesAll;
}

0
投票

这种方式的含义:

    List<String> l1 = Arrays.asList(healthMessages1);
    l1.addAll(Arrays.asList(healthMessages2));
    HealthMessage[] result = l1.toArray();

(需要一些泛化...:)


0
投票

数组是固定长度的,因此有多种选择。这是一对:

a)创建一个具有其他大小的新数组,然后手动复制所有元素。

healthMessagesAll = new HealthMessage[healthMessages1.length + healthMessages2.length];
int i = 0;
for (HealthMessage msg : healthMessases1)
{
   healthMessagesAll[i] = msg;
   i++;
}

for (HealthMessage msg : healthMessages2)
{
   healthMessagesAll[i] = msg;
   i++;
}

b)使用Arrays类提供的方法。您可以将数组转换为List,也可以批量复制元素。查看它提供的功能,然后选择适合您的功能。

UPDATE

看到您对重复项的评论。您可能希望将所有内容都放入Set中以确保唯一性。如果两次添加相同的元素,则不会第二次添加。然后,如果您明确需要带有其自己的Set方法的数组,则可以将Set转换回数组。

[如其他答复者所建议,toArray()也可以帮助您复制元素的内容,因此是我上面的替代方法(a)的简短版本。


0
投票

对于最复杂但最不占用内存的解决方案,您可以将它们包装在一个对象中。这提供了所有项目的System.arraycopy()和复制到新数组的Iterator<T>方法。可以轻松地增强它以提供获取器和设置器。

copyTo
© www.soinside.com 2019 - 2024. All rights reserved.