2017-02-22 38 views
0

我试图连接两个数组以向数值数组的列添加标签,并且还要在数组的最后一行之后添加总数。我在另一个堆栈溢出线程How can I concatenate two arrays in Java?上找到了一些代码。但是,我得到一个错误Java Array concatenation

异常在线程 “AWT-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[][] c中,T[] 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; 
} 

由于上述只能连接一维数组的二维数组,而不是周围的其他方式(如你需要添加表下方的“总计”行,更一般的方法是将写一个通用的“加入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) 

不能连接两个数组不同的类型。 aT的数组,bT[]的数组,即它是T的数组的阵列。

+0

谢谢。那是真实的。但是,我试图连接的两个数组的列数相同。声明对象[] [] headercol引发类型不匹配:无法将字符串转换为对象[] –