Подтвердить что ты не робот

Присоединить два массива в Java?

Возможный дубликат:
Как объединить два массива в Java?

У меня есть два объекта

HealthMessage[] healthMessages1;
HealthMessage[] healthMessages2;

HealthMessage[] healthMessagesAll;

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

Как мне присоединиться к двум объектам, поэтому я могу вернуть только один:

return healthMessagesAll;

Какой рекомендуемый способ?

4b9b3361

Ответ 1

Использование API-интерфейса Apache для коллективного использования является хорошим способом:

healthMessagesAll = ArrayUtils.addAll(healthMessages1,healthMessages2);

Ответ 2

Я бы выделил массив с общей длиной 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);
        }            
     }         
}

Ответ 3

Это более интуитивно понятно для записи, и вам не нужно иметь дело с индексами массива:

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

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

.. но не спрашивайте меня об этой производительности в отличие от System.arraycopy.

Ответ 4

Я бы пошел с 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;
}

Ответ 5

Массивы фиксированной длины, поэтому у вас есть различные альтернативы. Вот пара:

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. Вы можете преобразовать массив в список или скопировать элементы вокруг навалом. Посмотрите на функции, которые он предоставляет, и выберите тот, который вам подходит.

UPDATE

Увидев ваш комментарий о дубликатах. Вы можете поместить все в Set, что гарантирует уникальность. Если вы добавите один и тот же элемент дважды, он не будет добавлен второй раз. Затем вы можете преобразовать Set обратно в массив, если вы явно требуете массив со своим собственным методом toArray().

Как было предложено другими респондентами, System.arraycopy() помогает вам скопировать содержимое элементов, поэтому его более короткая версия моего альтернативный вариант (а) выше.

Ответ 6

как насчет этого:

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

(требуется немного генерации...:)

Ответ 7

И для самого сложного, но наименее голодного решения вы можете обернуть их в объект. Этот параметр предоставляет Iterator<T> для всех элементов и метод copyTo для копирования в новый массив. Его можно было бы легко улучшить, чтобы обеспечить геттеры и сеттеры.

public class JoinedArray<T> implements Iterable<T> {
  final List<T[]> joined;

  // Pass all arrays to be joined as constructor parameters.
  public JoinedArray(T[]... arrays) {
    joined = Arrays.asList(arrays);
  }

  // Iterate across all entries in all arrays (in sequence).
  public Iterator<T> iterator() {
    return new JoinedIterator<T>(joined);
  }

  private class JoinedIterator<T> implements Iterator<T> {
    // The iterator across the arrays.
    Iterator<T[]> i;
    // The array I am working on. Equivalent to i.next without the hassle.
    T[] a;
    // Where we are in it.
    int ai;
    // The next T to return.
    T next = null;

    private JoinedIterator(List<T[]> joined) {
      i = joined.iterator();
      a = nextArray();
    }

    private T[] nextArray () {
      ai = 0;
      return i.hasNext() ? i.next() : null;
    }

    public boolean hasNext() {
      if (next == null) {
        // a goes to null at the end of i.
        if (a != null) {
          // End of a?
          if (ai >= a.length) {
            // Yes! Next i.
            a = nextArray();
          }
          if (a != null) {
            next = a[ai++];
          }
        }
      }
      return next != null;
    }

    public T next() {
      T n = null;
      if (hasNext()) {
        // Give it to them.
        n = next;
        next = null;
      } else {
        // Not there!!
        throw new NoSuchElementException();
      }
      return n;
    }

    public void remove() {
      throw new UnsupportedOperationException("Not supported.");
    }
  }

  public int copyTo(T[] to, int offset, int length) {
    int copied = 0;
    // Walk each of my arrays.
    for (T[] a : joined) {
      // All done if nothing left to copy.
      if (length <= 0) {
        break;
      }
      if (offset < a.length) {
        // Copy up to the end or to the limit, whichever is the first.
        int n = Math.min(a.length - offset, length);
        System.arraycopy(a, offset, to, copied, n);
        offset = 0;
        copied += n;
        length -= n;
      } else {
        // Skip this array completely.
        offset -= a.length;
      }
    }
    return copied;
  }

  public int copyTo(T[] to, int offset) {
    return copyTo(to, offset, to.length);
  }

  public int copyTo(T[] to) {
    return copyTo(to, 0);
  }

  @Override
  public String toString() {
    StringBuilder s = new StringBuilder();
    Separator comma = new Separator(",");
    for (T[] a : joined) {
      s.append(comma.sep()).append(Arrays.toString(a));
    }
    return s.toString();
  }

  public static void main(String[] args) {
    JoinedArray<String> a = new JoinedArray<String>(
            new String[]{
              "One"
            },
            new String[]{
              "Two",
              "Three",
              "Four",
              "Five"
            },
            new String[]{
              "Six",
              "Seven",
              "Eight",
              "Nine"
            });
    for (String s : a) {
      System.out.println(s);
    }
    String[] four = new String[4];
    int copied = a.copyTo(four, 3, 4);
    System.out.println("Copied " + copied + " = " + Arrays.toString(four));

  }
}