2017-02-22 1 views
0

Ich versuche, zwei Arrays zu verketten, um Beschriftungen zu den Spalten eines numerischen Arrays hinzuzufügen, und um eine Summe nach der letzten Zeile des Arrays hinzuzufügen. Ich habe Code auf einem anderen Stack Overflow-Thread How can I concatenate two arrays in Java? gefunden. Aber ich erhalte eine FehlermeldungJava-Array-Verkettung

Exception in thread "AWT-Eventqueue-0" java.lang.ClassCastException: [Ljava.lang.Object; kann nicht in [[Ljava.lang.Object;

Hier ist mein Code

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

In welcher Zeile erhalten Sie den Fehler? –

+3

Sie versuchen, ein 'T [] c' a' T [] [] b', die zwei inkompatible Typen sind – DamCx

Antwort

1

Es scheint, wie Sie eine T[] den T[] a Header und den T[][] b Inhalt, aber Ihre concatenate Methode gibt verketten möchten. Sie müssen stattdessen T[][] zurückgeben, d. H. Ein Array von a.getClass() anstelle von a.getClass().getComponentType() erstellen. Auch in diesem neuen T[][] c wird der T[] a nur eine einzige Position einnehmen, so dass die Gesamtlänge nur b.length + 1 ist. Versuchen Sie folgendes:

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; 
} 

Da die oben nur ein 1D-Array zu einem 2D-Array verketten kann, aber nicht umgekehrt (wie Sie Zeile unterhalb der Tabelle zum Hinzufügen einer ‚Summe‘ bräuchten, ein allgemeinerer Ansatz ein generisches „join 2 Arrays mit gleichen Abmessungen“ Verfahren, und ein anderes Verfahren zu schreiben, wäre ein Element in einem Array umwickeln

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; 
} 

. Beispiel:

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)); 
} 

Ausgabe:

+0

Vielen Dank! das funktioniert gut. –

+0

Wenn ich jedoch versuche, die letzte Zeile zur Tabelle hinzuzufügen, die mit dem Gesamtpreis, bekomme ich eine ArrayStoreException. Es scheint mir, ich mache genau dasselbe in der Funktion concatenate2 wie in der Verkettungsfunktion. Hier ist der Code, den ich verwende –

+0

@m_h Der Unterschied ist, dass diese Funktion die Kopfzeile als _first_ Element im Array hinzufügt, während die Fußzeile die letzte Zeile sein müsste. –

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

Sie können nicht verketten zwei Array von verschiedenen Arten. a ist eine Anordnung von T s, b ist eine Anordnung von T[] s, d.h. es ist eine Anordnung von Anordnungen von T s.

+0

Danke. Das ist wahr. Die beiden Arrays, die ich verketten möchte, haben jedoch die gleiche Anzahl von Spalten. Objekt deklarieren [] [] headercol throws Typ stimmt nicht überein: String kann nicht in Objekt konvertiert werden [] –