Große Daten ins Vector füllen

Status
Nicht offen für weitere Antworten.

Iron Monkey

Bekanntes Mitglied
Hi an alle!

Ich als Client bekomme vom Server ein Datenpaket mit einer Größe von 136.213 bytes zurück und fülle die einzelnen Daten vom Datenpaket ins Vector hinzu. Bei dieser Größe des Datenpaketes entspricht ungefähr 543 Zeilen x 43 Spalten für die JTable. Ich gebe ja nach dem Füllen des Vector auch der JTable weiter, um die Daten in der Tabelle anzuzeigen.

Das Problem ist nur, dass das Füllen des Vectors ziemlich lange dauert. Der Grund liegt daran, dass ich im ganzen Datenpaket bestimmte Größe per For-Schleife ausschneide und damit nochmal per For-Schleife (pro Zeile) dann ins Vector füllen, z.B.:

Unter der Lupe im Datenpaket:

Für die 1. Zeile
Die ersten 4 bytes --> Nummer[4] ---> Ins Vector setValueAt( 0, ... )
Die zweiten 20 bytes --> Name[20] ---> Ins Vector setValueAt( 0, ... )
Die dritten 20 bytes --> Vorname[20] ---> Ins Vector setValueAt( 0, ... )
Die vierten 30 bytes --> Strasse[30] ---> Ins Vector setValueAt( 0, ... )
usw.......

Für die 2. Zeile
Die ersten 4 bytes nach der Gesamtlänge der 1. Zeile --> Nummer[4] ---> Ins Vector setValueAt( 1, ... )
Die zweiten 20 bytes nach der Gesamtlänge der 1. Zeile --> Name[20] ---> Ins Vector setValueAt( 1, ... )
Die dritten 20 bytes nach der Gesamtlänge der 1. Zeile --> Vorname[20] ---> Ins Vector setValueAt( 1, ... )
Die vierten 30 bytes nach der Gesamtlänge der 1. Zeile --> Strasse[30] ---> Ins Vector setValueAt( 1, ... )
usw.......


Gibt es eine andere Möglichkeit, das Füllen schneller bearbeiten zu können?

Gruß
Iron Monkey
 
Wie groß ist die Anfangskapazität des Vectors? Wahrscheinlich wird der Vector zig mal umkopiert, wenn er über die momentane Größe hinaus wachsen muss. Wenn du die (ungefähre) End-Größe kennst, solltest du sie schon im Konstruktor angeben.
Alternativ kannst du auch eine ArrayList oder LinkedList nehmen, Vector ist eigentlich veraltet und hässlich.
 
Hi tfa!

Alternativ kannst du auch eine ArrayList oder LinkedList nehmen, Vector ist eigentlich veraltet und hässlich.

Also, ich habe eine Klasse, die von AbstractTableModel abgeleitet wird, mit Vector aufgebaut und du meinst, in der Klasse mit ArrayList oder LinkedList geht das viel schneller?

Finanzbuchhaltung_Listen.java
Code:
public class Finanzbuchhaltung_Listen extends AbstractTableModel implements Column {

	private static final long serialVersionUID = 1L;
	
	public Vector m_FinanzbuchhaltungVector;
	
	public String strColumnName = "";
	
	public Finanzbuchhaltung_Listen() {
		m_FinanzbuchhaltungVector = new Vector();
	}
	
	//Liefert die Breite der Tabelle ( Breite = Alle Spalten )
	public int getColumnCount() {
		return m_columnsFinanzbuchhaltung.length;
	}

	//Liefert die Anzahl der Elemente in der Liste
	public int getRowCount() {
		return m_FinanzbuchhaltungVector == null ? 0 : m_FinanzbuchhaltungVector.size();
	}
	
	public int getColumn( int c ) 
	{
		return m_columnsFinanzbuchhaltung[c].m_width;
	}
	
	public String getColumnName( int c ) 
	{
		return m_columnsFinanzbuchhaltung[c].m_title;
	}
	
	public void setColumnName( String name ) {
		this.strColumnName = name;
	}
	
	public Class getColumnClass(int c) {
		return m_columnsFinanzbuchhaltung[c].m_class;
    }
	
	public boolean isCellEditable(int nRow, int nCol ) 
	{
		return false;
	}
	
	//Liefert einen Wert für die Zelle bei ColIndex und RowIndex
	public Object getValueAt(int nRow, int nCol) {
		
		if( nRow < 0 || nRow > getRowCount() )
			return null;

		Finanzbuchhaltung_ListenData row = (Finanzbuchhaltung_ListenData) m_FinanzbuchhaltungVector.elementAt(nRow);

		switch( nCol ) {
			case COL_FINANZ_POS:
				try {
					return new Integer( row.m_Position );
				} 
				catch (NumberFormatException e) 
				{
					return new Integer( 0 );
				}
			case COL_FINANZ_KONTONR:
				try {
					return new Integer( row.m_KontoNr );
				} 
				catch (NumberFormatException e) 
				{
					return new Integer( 0 );
				}

                        usw. bis zu 42. Spalten
		}

		return null;
	}
	
	//Setzt einen Wert in eine Zelle.
	public void setValueAt( Object value, int nRow, int nCol ) {
				
		if( nRow < 0 || nRow > getRowCount() ) {
			return;
		}
		
		Finanzbuchhaltung_ListenData row = new Finanzbuchhaltung_ListenData();
		
		try {
			row = ( Finanzbuchhaltung_ListenData ) m_FinanzbuchhaltungVector.elementAt( nRow );
		}
		catch( Exception e ) {
			System.out.println( e.getMessage() );
		}
		
		String svalue = null;
		
		try 
		{
			svalue = ( value.equals( null ) ) ? "" : value.toString();
		} 
		catch (Exception e1) {
			System.out.print( e1.getMessage() );
		}

	        // Insgesamt 42 Spalten 
		switch ( nCol ) {
			case COL_FINANZ_POS:
				try {
					row.m_Position = new Integer( svalue ).intValue();
				} catch (NumberFormatException e) {}
				break;
			case COL_FINANZ_KONTONR:
				if( !svalue .equals("") )
				{
					try {
						row.m_KontoNr = new Integer( svalue ).intValue();
					} catch (NumberFormatException e) {}
				}
				else row.m_KontoNr = 0;
				break;

                        usw. bis zu 42. Spalten
		}
	}
	
	//Elemente in das Vektor einfügen
	public void insert( int nRow ) {
		
		if( nRow < 0 ) {
			nRow = 0;
		}
			
		if( nRow > m_FinanzbuchhaltungVector.size() )
			nRow = m_FinanzbuchhaltungVector.size();
			
		m_FinanzbuchhaltungVector.insertElementAt( new Finanzbuchhaltung_ListenData(), nRow );
	}

	// Einzelne Elemente im Vector löschen
	public boolean delete( int nRow ) {
		
		if( nRow < 0 || nRow >= m_FinanzbuchhaltungVector.size() )
			return false;
		
		m_FinanzbuchhaltungVector.remove( nRow );
		
		return true;
		
	}
		
	// Alle Elemente im Vector löschen
	public boolean deleteAll() {
		m_FinanzbuchhaltungVector.clear();
		return true;
	}

}

Finanzbuchhaltung_ListenData.java

Code:
public class Finanzbuchhaltung_ListenData {

	public int m_Position;
	public int m_KontoNr;
	public String m_RechNr;
	public int m_Vertrag;
	public String m_Belegdatum;
	public float m_Mwst;
	public String m_Betrag;
	public String m_SBetrag;
	public String m_Gegenkonto;
	public int m_Auszifferung;
	public String m_Buchungstext;
	public String m_Art;
	public String m_Abrechnungsart;
	public int m_Buchungsjahr;
	public int m_Artnummer;
	public int m_JournalNr;
	public String m_NSL;
	public int m_EP00;
	public int m_EP01;
	public int m_EP02;
	public int m_EP03;
	public int m_EP04;
	public int m_EP05;
	public int m_EP06;
	public String m_Inkasso;
	public String m_AbrDatVon;
	public String m_AbrDatBis;
	public String m_Kostenuebernahme;
	public String m_Passwort;
	public String m_CallNr;
	public String m_Prioritaet;
	public String m_RechnMerker;
	public String m_SollHaben;
	public String m_NAbgeschlossen;
	public String m_DatumSich;
	public String m_BetrSich;
	public String m_knz;
	public String m_Anzeigen;
	public String m_Saldo;
	public String m_BetrSichK;
	public String m_CrtSich;
	public String m_LeGr;
	public String m_RowDelete;
	
	public Finanzbuchhaltung_ListenData() 
	{
		m_Position 			= 0;
		m_KontoNr 			= 0;
		m_RechNr 			= "";
		m_Vertrag			= 0;
		m_Belegdatum 		= "";
		m_Mwst 				= 0.0f;
		m_Betrag 			= "";
		m_SBetrag			= "";
		m_Gegenkonto 		= "";
		m_Auszifferung		= 0;
		m_Buchungstext		= "";
		m_Art				= "";
		m_Abrechnungsart	= "";
		m_Buchungsjahr		= 0;
		m_Artnummer			= 0;
		m_JournalNr			= 0;
		m_NSL				= "";
		m_EP00				= 0;
		m_EP01				= 0;
		m_EP02				= 0;
		m_EP03				= 0;
		m_EP04				= 0;
		m_EP05				= 0;
		m_EP06				= 0;
		m_Inkasso			= "";
		m_AbrDatVon			= "";
		m_AbrDatBis			= "";
		m_Kostenuebernahme	= "";
		m_Passwort			= "";
		m_CallNr			= "";
		m_Prioritaet		= "";
		m_RechnMerker		= "";
		m_SollHaben			= "";
		m_NAbgeschlossen	= "";
		m_DatumSich			= "";
		m_BetrSich			= "";
		m_knz				= "";
		m_Anzeigen			= "";
		m_Saldo				= "";
		m_BetrSichK			= "";
		m_CrtSich			= "";
		m_LeGr				= "";
		m_RowDelete 		= "";
	}

	public Finanzbuchhaltung_ListenData( 
			int position, int kontonr, int vertrag, String rechnr, String belegdatum, String sollhaben, 
			String betrag, float mwst, String gegenkonto, int journalnr, String buchungstext, int buchungsjahr, 
			int auszifferung, String abrechnungsart, String nabgeschlossen, String nsl, String art, int ep00, 
			int ep01, int ep02, int ep03, int ep04, int ep05, int ep06, String inkasso, String callnr, 
			String abrdatvon, String abrdatbis, String passwort, String kostenuebernahme, String sbetrag, 
			int artnummer, String prioritaet, String rechnmerker, String datumsich, String betrbich, 
			String knz, String anzeigen, String saldo, String betrbichk, String crtsich, 
			String legr, String rowDelete )
	{
		m_Position 			= position;
		m_KontoNr 			= kontonr;
		m_RechNr 			= rechnr;
		m_Vertrag			= vertrag;
		m_Belegdatum 		= belegdatum;
		m_Mwst 				= mwst;
		m_Betrag 			= betrag;
		m_SBetrag			= sbetrag;
		m_Gegenkonto 		= gegenkonto;
		m_Auszifferung		= auszifferung;
		m_Buchungstext		= buchungstext;
		m_Art				= art;
		m_Abrechnungsart	= abrechnungsart;
		m_Buchungsjahr		= buchungsjahr;
		m_Artnummer			= artnummer;
		m_JournalNr			= journalnr;
		m_NSL				= nsl;
		m_EP00				= ep00;
		m_EP01				= ep01;
		m_EP02				= ep02;
		m_EP03				= ep03;
		m_EP04				= ep04;
		m_EP05				= ep05;
		m_EP06				= ep06;
		m_Inkasso			= inkasso;
		m_AbrDatVon			= abrdatvon;
		m_AbrDatBis			= abrdatbis;
		m_Kostenuebernahme	= kostenuebernahme;
		m_Passwort			= passwort;
		m_CallNr			= callnr;
		m_Prioritaet		= prioritaet;
		m_RechnMerker		= rechnmerker;
		m_SollHaben			= sollhaben;
		m_NAbgeschlossen	= nabgeschlossen;
		m_DatumSich			= datumsich;
		m_BetrSich			= betrbich;
		m_knz				= knz;
		m_Anzeigen			= anzeigen;
		m_Saldo				= saldo;
		m_BetrSichK			= betrbichk;
		m_CrtSich			= crtsich;
		m_LeGr				= legr;
		m_RowDelete 		= rowDelete;
	}

}
 
Iron Monkey hat gesagt.:
Hi tfa!

Alternativ kannst du auch eine ArrayList oder LinkedList nehmen, Vector ist eigentlich veraltet und hässlich.

Also, ich habe eine Klasse, die von AbstractTableModel abgeleitet wird, mit Vector aufgebaut und du meinst, in der Klasse mit ArrayList oder LinkedList geht das viel schneller?
Nein, das habe ich nicht behauptet.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben