ubuntuusers.de

Verzweifelte Frage wegen Arraylist-Übergabe

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

gelbtrala

Anmeldungsdatum:
1. Juli 2007

Beiträge: Zähle...

Hallo, ich habe eine Frage.
Ich möchte ein Tabellenblatt aus einer MySQL Datenbank auslesen und diese Daten in eine Arraylist übernehmen, welche mir alles an meine HTML Ausgabe weitergibt.

Der mit dem ich das zusammen gemacht hatte, machte das erst mit Vector, leider funzte sein Vectorauslesen nicht, und ich hätte es eben lieber über die Arraylist gelöst.
Jetzt ist vor allem die Frage, kann ich dieses auch als String übergeben?
Vielen Dank und tausend Grüße.

   public void auslesen(Beans beanclass) {

                    dbconnect(); 
                    String sql = ("SELECT * FROM tablea ta NATURAL JOIN tableb tb WHERE ta.wert ="+beanclass.getWert());
                    Statement s;
                    
                    ArrayList row;
                    ArrayList col;

                    try
                        {
                             row = new ArrayList();
                             col = new ArrayList();
                             
                             s = connection.createStatement();
                             ResultSet rs = s.executeQuery(sql);
                             System.out.println("sql: "+sql);
                             
                             ResultSetMetaData rsmd = resultSet.getMetaData();
                                                     
                             int columns = rsmd.getColumnCount();
                             System.out.println(columns);
                             for ( int i = 1; i < columns; i++ )
                             
                                    {
                                            while ( rs.next() )
                                            System.out.println("While 1");
                                            {
                                              row.add( rs.getObject( i + 1 ) );
                                              System.out.println("While 2");
                                            }

                                            {
                                              col.addAll( i, row );
                                            System.out.println("col.addAll: "+i +row);
                                            }
                                          }

                            
                           rs.close();
                           System.out.println(col);
                           System.out.println(row);
                           s.close();
                           dbclose();
                        }
                        
                        catch (Exception e) {
                                                System.out.println(e);
                        {
                        //return null;
                        }
                       // return col;
                        }
                         
   }

Anfangs über die Vectorlösung wurde es so übergeben:

String[][] ss = (String[][]) vec.toArray( new String[vec.size()][n] );

Daraus möchte ich auf die gleich folgene Methode übergeben

    private static final void ausgabeDB( String[][] ss, String htmlFile, boolean htmlFileWithoutHtmlTag, Beans beanclass)
    {
      if( null == ss || 0 >= ss.length || null == ss[0] ||
          null == htmlFile || 0 >= htmlFile.length() ) return;
      try {
        int i, j, n = ss[0].length;
        beanclass.Erg.append("<table border=1 cellspacing=0 cellpadding=2>\n<tr bgcolor='#EBEEEE'>");
        for( i=0; i<n; i++ )
            beanclass.Erg.append("<th>" + ss[0][i] + "</th>");
        for( j=1; j<ss.length; j++ ) {
            beanclass.Erg.append("</tr>\n<tr>");
          for( i=0; i<n; i++ )
              beanclass.Erg.append("<td>" + ss[j][i] + "</td>" );
        }
        beanclass.Erg.append( "</tr>\n</table>\n"  );
       // beanclass.setAuswertung(Erg.toString());
        System.out.println( htmlFile + " erzeugt." );
      } catch( Exception ex ) {
        System.out.println( "Fehler beim Erzeugen der HTML-Datei '" +
                            htmlFile + "': " + ex );
      }
    }

ryiden

Avatar von ryiden

Anmeldungsdatum:
2. Juni 2006

Beiträge: 826

Wohnort: Mos Eisley

Versuchs mal mit generischen Datentypen:

Vector<String> elements = new Vector<String>();
for (int row = 0; row < rowCount; row++)
{
  for (int col = 0; col < colCount; col++)
  {
    elements.add(...);
  }
} 

Wenn du die Anzahl der Spalten speicherst, brauchst du kein zweidimensionales Array mehr. Das macht den Code um einiges übersichtlicher. Jedoch würde ich die Funktion toArray() dennoch nicht benutzen, da dort ein komplett neues Array angelegt wird und alle Elemente dort hineinkopiert werden. Das kostet CPU-Zeit und ist besonders bei großen Tabellen sehr Speicherintensiv. Übergib lieber den kompletten Vektor an die Funktion und verwende einen Iterator, um auf die Elemente zuzugreifen, das ist am effektivsten:

private static final void ausgabeDB(Vector elements, int colCount, String htmlFile, boolean htmlFileWithoutHtmlTag, Beans beanclass)
{
  Iterator<String> elementIterator = elements.iterator();
  String nextElement;
  int elementNumber = 0;
  while (elementIterator.hasNext())
  {
    nextElement = elementIterator.next();
    elementNumber++;
    if (elementNumber % colCount == 0)
    {
      // neue Zeile
      ...
    }
    ...
  }
} 

Apollon

Avatar von Apollon

Anmeldungsdatum:
27. Oktober 2004

Beiträge: 724

Wohnort: Darmstadt

Ueber ArrayList von http://java.sun.com/javase/6/docs/api/: This class is roughly equivalent to Vector, except that it is unsynchronized.

Mir ist unklar was Du willst.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Apollon hat geschrieben:

Mir ist unklar was Du willst.

Mir auch ziemlich.
Aber Einrückungen sind nur hilfreich, wenn man seinen Stil durchhält - vielleicht hast Du blanks und Tabs gemischt, was selten eine gute Idee ist.

for (int i = 1; i < columns; i++)
{
	while (rs.next ())
		System.out.println ("While 1");
	{
		row.add (rs.getObject (i + 1));
		System.out.println ("While 2");
	}

	{
		col.addAll (i, row);
		System.out.println ("col.addAll: "+i +row);
	}


Das "While 1" ist das einzige Statement das in der while-Schleife ausgeführt wird - sind hier die geschweiften Klammern verünglückt?
Dann ist von einem "While 2" die Rede - ich sehe es nicht.
Und row(s) und col(s) scheint mir semantisch vertauscht.

So würde es für mich schon sinnvoller aussehen:

System.out.println ("While 1");
while (rs.next ())
{
	List <String> cols = new ArrayList <String> (); 
	for (int i = 1; i < columns; i++)
	{
		cols.add (rs.getObject (i + 1));
	}
	rows.add (cols);
} 


Bleibt noch die Frage nach i und columns.
Bei 4 Columns zählt die for-Schleife von 1 bis 3.
rs.getObject besorgt dann die Objekte 2 bis 4.

Soll das nicht

	for (int i = 1; i <= columns; i++)
	{
		cols.add (rs.getObject (i));
	}


heißen?

private static final void ausgabeDB (List <List <String>> rows, String htmlFile, boolean htmlFileWithoutHtmlTag, Beans beanclass)
{
	if (null == htmlFile || 0 >= htmlFile.length ()) 
		return;
	try 
	{
		beanclass.Erg.append ("<table border=1 cellspacing=0 cellpadding=2>\n<tr bgcolor='#EBEEEE'>");
		List<String> header = rows.remove (0);
		for (String s : header)
			beanclass.Erg.append ("<th>" + s + "</th>");
		
		for (List <String> row : rows) 
		{
			beanclass.Erg.append ("</tr>\n<tr>");
			for (String s: row)
				beanclass.Erg.append ("<td>" + s + "</td>");
		}
		beanclass.Erg.append ("</tr>\n</table>\n");
	} 
	catch (Exception ex) 
	{
		System.err.println ("Fehler beim Erzeugen der HTML-Datei '" + htmlFile + "': " + ex);
	}
} 


Falls Du an Java 1.4 gebunden bist fällt die Typisierung der Listen und die vereinfachte for-Schleife als Option natürlich weg.

fnumatic

Anmeldungsdatum:
20. Februar 2007

Beiträge: 379

ResultSet rs = s.executeQuery(sql);
... 
 ResultSetMetaData rsmd = resultSet.getMetaData(); 

das wird nicht laufen
schreibe am besten die Variablen aus, besonders wenn mehrere Personen am Code arbeiten

statement = connection.createStatement(); 
ResultSet resultSet = statement.executeQuery(sql);
... 
 ResultSetMetaData metaData = resultSet.getMetaData(); 

ryiden

Avatar von ryiden

Anmeldungsdatum:
2. Juni 2006

Beiträge: 826

Wohnort: Mos Eisley

Aber Einrückungen sind nur hilfreich, wenn man seinen Stil durchhält - vielleicht hast Du blanks und Tabs gemischt, was selten eine gute Idee ist.

In Eclipse dürfte das Problem mit CTRL+SHIFT+F behoben sein.

Antworten |