我有两个对象
HealthMessage[] healthMessages1;
HealthMessage[] healthMessages2;
HealthMessage[] healthMessagesAll;
healthMessages1 = x.getHealth( );
healthMessages2 = y.getHealth( );
我应该如何连接两个对象,所以我只能返回一个:
return healthMessagesAll;
推荐的方法是什么?
使用Apache Commons Collections API是一种好方法:
healthMessagesAll = ArrayUtils.addAll(healthMessages1,healthMessages2);
我分配了一个数组,它们的总长度为healthMessages1
和healthMessages2
,并使用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);
}
}
}
这样写起来更加直观,您不必处理数组索引:
Collection<HealthMessage> collection = new ArrayList<HealthMessage>();
collection.addAll(Arrays.asList(healthMessages1));
collection.addAll(Arrays.asList(healthMessages2));
HealthMessage[] healthMessagesAll = collection.toArray(new HealthMessage[] {});
..但不要问我与System.arraycopy
相对的性能。
我会选择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;
}
这种方式的含义:
List<String> l1 = Arrays.asList(healthMessages1);
l1.addAll(Arrays.asList(healthMessages2));
HealthMessage[] result = l1.toArray();
(需要一些泛化...:)
数组是固定长度的,因此有多种选择。这是一对:
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)的简短版本。
对于最复杂但最不占用内存的解决方案,您可以将它们包装在一个对象中。这提供了所有项目的System.arraycopy()和复制到新数组的Iterator<T>
方法。可以轻松地增强它以提供获取器和设置器。
copyTo