Schnell suchen/sortieren

T

Tobias Köhler

Guten Morgen:)
Habe ein Programm geschrieben, dass eine Exceltabelle einliest und diese Werte in einer SWT-Table anzeigt. Über Suchen öffnet sich die Suchtable und auf Tastendruck wird in der Spalte nach diesen Einträgen gesucht.
Zu Beginn der Suche wird erst festgestellt in welcher Spalte geschrieben wurde. Dann werden die ersten Zeichen jeder Zelle dieser Spalte verglichen und neu ausgegeben. Bedeutet die tabelle wird bei jeder neuen Tasteneingabe neu gezeichnet. Soviel zum Programm;)
Die Daten werden in ArrayLists gespeichert. Pro Zeile wird eine neue ArrayList erzeugt mit den Daten einer Zeile.
Danach werden diese ArrayLists in eine "große" ArrayList tabelle gespeichert. Ich durchsuche also per for-Schleifen:
Java:
String aktuell = tabelle.get(i).get(zelle).toLowerCase();	
/**
 * Nur suchen, wenn der Inhalt der Zelle nicht kürzer 
 * als das Suchwort ist. Andernfalls wird Exception ausgelöst
*/
if(aktuell.length()>=suchwort.length())
{
	/**
	* Durchsuche die aktuelle Zelle nach Übereinstimmungen
	* zu durchsuchender Bereich ist begrenzt durch die Länge 
	 * des Suchwortes.
	 * Somit ist möglich: 
	* Suchwort = "1" findet "1, 10" aber nicht "51, 61"
	 */
	if(aktuell.substring(0, suchwort.length()).indexOf(suchwort) != -1)					
		treffer = true;
}
else
      treffer = false;

Lange Rede, kurzer Sinn: Wie kann ich das schneller machen Bisher habe ich nur 10000 Daten und er braucht schon 7 Sekunden. Das Programm, das dieses hier ersetzen soll, sucht allerdings wahnsinnig schnell. Tausende an Zeilen per Tastendruck. Wie ist das möglich?^^ Ich weiß, dass meine Variante sehr performancelastig ist durch die neuen ArrayLists, Strings etc. Aber wie macht man es besser? :)
Danke für eure Geduld und Hilfe;)
 
Hallo,

Zeige mal bitte die komplette suche, inclusive for-schleifen.

MFG

zEriX
 
Zuletzt bearbeitet:
Da ist sie^^
Java:
/**
* Durchsucht die Tabelle und filtert sie nach passenden Einträgen
* @param suchwort Definiert das zu suchende Schlüsselwort
* @param zelle Gibt an, in welcher Spalte gesucht werden soll
*/
public static void sucheEintrag(String suchwort, int zelle)
{
	if(zelle>=0)
	{
		table.removeAll();
		table.setItemCount(0);
		boolean treffer = false;
		for(int i=1; i<tabelle.size(); i++)
		{			
			String aktuell = tabelle.get(i).get(zelle).toLowerCase();	
			/**
			 * Nur suchen, wenn der Inhalt der Zelle nicht kürzer 
			 * als das Suchwort ist. Andernfalls wird Exception ausgelöst
			 */
			if(aktuell.length()>=suchwort.length())
			{
				/**
				 * Durchsuche die aktuelle Zelle nach Übereinstimmungen
				 * zu durchsuchender Bereich ist begrenzt durch die Länge 
				 * des Suchwortes.
				 * Somit ist möglich: 
				 * Suchwort = "1" findet "1, 10" aber nicht "51, 61"
				 */
				if(aktuell.substring(0, suchwort.length()).indexOf(suchwort) != -1)								treffer = true;
			}
			else
				treffer = false;
					
				
					
			if(treffer)
			{
				TableItem item = new TableItem(table, SWT.NONE);
				String[] content = new String[table.getColumnCount()];
				for(int j=0; j<content.length; j++)
				{
					content[j] = tabelle.get(i).get(j);
				}
				item.setText(content);
				table.redraw();
			}
			treffer = false;
		}	
		for(int i=0; i<table.getItemCount(); i++)
		{
			if(i % 2 == 0)					table.getItem(i).setBackground(display.getSystemColor(
SWT.COLOR_TITLE_INACTIVE_FOREGROUND));
	        }
		table.redraw();
	}
	else
	{
		if(table.getItemCount()!=tabelle.size())
		{
			table.removeAll();
			table.setItemCount(0);
			for(int i=1; i<tabelle.size(); i++)
			{
				TableItem item = new TableItem(table, SWT.NONE);
				String[] content = new String[table.getColumnCount()];
				for(int j=0; j<content.length; j++)
				{
					content[j] = tabelle.get(i).get(j);
				}
				item.setText(content);
				table.redraw();
			}
			for(int i=0; i<table.getItemCount(); i++)
			{
				if(i % 2 == 0)						table.getItem(i).setBackground(display.getSystemColor(
SWT.COLOR_TITLE_INACTIVE_FOREGROUND));
			}
			table.redraw();
		}			
	}
}
 
Ja, hatte ich ja schon so gesagt;)
Hier der Code dazu:
Java:
public static ArrayList<ArrayList<String>> tabelle;
public static ArrayList<String> zeile;

Sheet sheet = workbook.getSheet(0);
tabelle = new ArrayList<ArrayList<String>>();
for(int i=0; i<sheet.getRows(); i++)
{
	zeile = new ArrayList<String>();
	zeile.add(String.valueOf(i));
	for(int j=0; j<sheet.getColumns(); j++)                    
		zeile.add(sheet.getCell(j,i).getContents());
	tabelle.add(zeile);				       
}
 
Versuch es mal hiermit
Java:
public static void sucheEintrag(String suchwort, int zelle) {
		Display display = Display.getCurrent();
		if (zelle >= 0 || table.getItemCount() != tabelle.size()) {
			table.removeAll();
			table.setItemCount(0);
			if (zelle >= 0) {

				boolean treffer = false;
				for (int i = 1, size = tabelle.size(); i < size; i++) {
					List<String> list = tabelle.get(i);
					String aktuell = tabelle.get(i).get(zelle).toLowerCase();

					/**
					 * Nur suchen, wenn der Inhalt der Zelle nicht kürzer als
					 * das Suchwort ist. Andernfalls wird Exception ausgelöst
					 */
					treffer = aktuell.matches(suchwort + "\\s*\\S*");

					if (treffer) {
						TableItem item = new TableItem(table, SWT.NONE);
						item.setText((String[]) list.toArray());
					}
					treffer = false;
				}

			} else {
				if (table.getItemCount() != tabelle.size()) {

					for (int i = 1, size = tabelle.size(); i < size; i++) {
						List<String> list = tabelle.get(i);
						TableItem item = new TableItem(table, SWT.NONE);
						item.setText((String[]) list.toArray());
					}

				}
			}
			for (int i = 0, itemCount = table.getItemCount(); i < itemCount; i++) {
				if (i % 2 == 0)
					table.getItem(i).setBackground(display.getSystemColor(SWT.COLOR_TITLE_INACTIVE_FOREGROUND));
			}
			table.redraw();
		}

	}

MFG

zEriX
 
Danke schonmal;)
Nur kann er nicht von String zu Array casten
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

in Zeile 32...
 
Versuch es hiermit nochmal

Code:
public static void sucheEintrag(String suchwort, int zelle) {
		Display display = Display.getCurrent();
		if (zelle >= 0 || table.getItemCount() != tabelle.size()) {
			table.removeAll();
			table.setItemCount(0);
			if (zelle >= 0) {

				boolean treffer = false;
				for (int i = 1, size = tabelle.size(); i < size; i++) {
					List<String> list = tabelle.get(i);
					String aktuell = tabelle.get(i).get(zelle).toLowerCase();

					/**
					 * Nur suchen, wenn der Inhalt der Zelle nicht kürzer als
					 * das Suchwort ist. Andernfalls wird Exception ausgelöst
					 */
					treffer = aktuell.matches(suchwort + "\\s*\\S*");

					if (treffer) {
						TableItem item = new TableItem(table, SWT.NONE);
						String[] s = new String[list.size()];
						item.setText(list.toArray(s));
					}
					treffer = false;
				}

			} else {
				if (table.getItemCount() != tabelle.size()) {

					for (int i = 1, size = tabelle.size(); i < size; i++) {
						List<String> list = tabelle.get(i);
						TableItem item = new TableItem(table, SWT.NONE);
						String[] s = new String[list.size()];
						item.setText(list.toArray(s));
					}

				}
			}
			for (int i = 0, itemCount = table.getItemCount(); i < itemCount; i++) {
				if (i % 2 == 0)
					table.getItem(i).setBackground(display.getSystemColor(SWT.COLOR_TITLE_INACTIVE_FOREGROUND));
			}
			table.redraw();
		}

	}

MFG

zEriX
 
Dankeschön:)
Test mit 5000 Zeilen und 4 Spalten:
Vorher: 11 Sekunden
Nachher: 2 Sekunden

Also schon deutlich schneller:)
Was mich noch stört: die Table blinkt immer, wie kann ich hier double buffering aktivieren? Ist ein wenig OffTopic aber nur eine kurze Zusatzfrage;)^^
 
Zurück