2017-02-22 20 views
0

Я пытаюсь объединить два массива, чтобы добавить метки в столбцы числового массива, а также добавить итоговое значение после последней строки массива. Я нашел код в другом потоке переполнения стека How can I concatenate two arrays in Java?. Но я получаю сообщение об ошибкеКонкатенация Java Array

Исключение в потоке "АВТ-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; не может быть добавлено к [[Ljava.lang.Object;

Вот мой код

public void getpdf(double[][] pricelist, ArrayList<Piece> in) { 
    PDDocument doc = new PDDocument(); 
    PDPage page = new PDPage(); 
    doc.addPage(page); 
    try { 
      PDPageContentStream contentStream = 
          new PDPageContentStream(doc, page); 
      JTable table=gettable(pricelist,in); 

      Object[] headercol={"Type","Asc","Ref","Commandes","Prix unitaire","Prix total"}; 
      Object[][] content=getTableData(table); 
      Object[][] global=(Object[][]) concatenate (headercol,content); 
      //drawTable(page, contentStream, 700, 75, headercol); 
      drawTable(page, contentStream, 700, 75, content); 
      contentStream.close(); 
      doc.save("bill.pdf"); 
    } 
    catch (IOException ex) { 
     ex.printStackTrace(); 
    } 

} 

public <T> T[] concatenate (T[] a, T[][] b) { 
    int aLen = a.length; 
    int bLen = b.length; 

    @SuppressWarnings("unchecked") 
    T[] c = (T[]) Array.newInstance(a.getClass().getComponentType(), aLen+bLen); 
    System.arraycopy(a, 0, c, 0, aLen); 
    System.arraycopy(b, 0, c, aLen, bLen); 

    return c; 
} 
+0

В какой строке вы принимаете ошибку? –

+3

Вы пытаетесь ввести 'T [] c' a' T [] [] b', которые являются двумя несовместимыми типами – DamCx

ответ

1

Похоже, вы хотите, чтобы сцепить T[] a заголовок и T[][] b содержания, но ваш метод concatenate возвращает T[]. Вместо этого вы должны вернуть T[][], т. Е. Создать массив из a.getClass() вместо a.getClass().getComponentType(). Кроме того, в этом новом T[][] cT[] a займет только одно положение, поэтому общая длина составляет всего b.length + 1. Попробуйте это:

public <T> T[][] concatenate (T[] a, T[][] b) { 
    T[][] c = (T[][]) Array.newInstance(a.getClass(), b.length + 1); 
    c[0] = a; 
    System.arraycopy(b, 0, c, 1, b.length); 
    return c; 
} 

Поскольку выше, может только сцепить в 1D массива в 2D массива, но не наоборот (как вам нужно для добавления строки «ДОЗ» ниже таблицы, более общий подход должен был бы написать общий «соединить 2 массивов с одинаковыми размерами» методом, и другим способом, чтобы обернуть элемент в массив

public <T> T[] wrap(T x) { 
    T[] a = (T[]) Array.newInstance(x.getClass(), 1); 
    a[0] = x; 
    return a; 
} 

public <T> T[] concatenate (T[] a, T[] b) { 
    T[] c = (T[]) Array.newInstance(a.getClass().getComponentType(), a.length + b.length); 
    System.arraycopy(a, 0, c, 0, a.length); 
    System.arraycopy(b, 0, c, a.length, b.length); 
    return c; 
} 

Пример:.

String[] headercol = {"Type","Asc","Ref","Commandes","Prix unitaire","Prix total"}; 
String[][] content = {{"A","B","C","D","E","F","G","H"}, {"1","2","3","4","5","6","7","8"}}; 
String[] footer = {"a","b","c","d","e","f","g","h"}; 

String[][] global = (String[][]) concatenate (wrap(headercol),content); 
global = (String[][]) concatenate (global, wrap(footer)); 

for (String[] row : global) { 
    System.out.println(Arrays.toString(row)); 
} 

Выход:

[Type, Asc, Ref, Commandes, Prix unitaire, Prix total] 
[A, B, C, D, E, F, G, H] 
[1, 2, 3, 4, 5, 6, 7, 8] 
[a, b, c, d, e, f, g, h] 
+0

Спасибо большое! это прекрасно работает. –

+0

Однако при попытке добавить последнюю строку в таблицу, с общей ценой, я получаю исключение ArrayStoreException. Мне кажется, что я выполняю то же самое в функции concatenate2, как и в функции concatenate. Вот код, который я использую –

+0

@m_h. Разница в том, что эта функция добавляет заголовок в качестве элемента _first_ в массиве, тогда как нижний колонтитул должен быть последней строкой. –

3
public <T> T[] concatenate (T[] a, T[][] b) 

Вы не можете сцепить два массива различных типов. a - массив из T s, b - это массив из T[] s, то есть массив массивов T s.

+0

Спасибо. Это правда. Однако два массива, которые я пытаюсь объединить, имеют одинаковое количество столбцов. Объявление объекта [] [] headercol throws Тип несоответствия: невозможно преобразовать String в Object [] –