JTable SelectRowByValue(Object Value)?

Status
Nicht offen für weitere Antworten.

Lkatsch

Neues Mitglied
Hi, ich habe eine Tabelle mit einer Spalte. Diese enthält Strings. Eine Methode soll die Zeile in der Tabelle markieren, die einen bestimmten String enthält. Im Moment mache ich das auf die folgende unschöne Art:


Code:
public void selectTerm(String termKey){
         ...
	for (int rowIndex = 0; rowIndex < model.getRowCount();rowIndex++){
		if (model.getValueAt(rowIndex, 0).equals(termKey)){
			jTableTermList.changeSelection(rowIndex, 0, false, false);
			break;
		}
	}						
}


Das ist mit steigender Zeilenzahl sehr langsam 🙁

Im TableModel sind die Daten als HashMap gespeichert (Der Key ist der String der auch gesucht wird). Also denke ich gibt es bestimmt eine Möglichkeit an den Index zu kommen.

Model Sieht so aus:

Code:
...
public class TableModelTerms extends AbstractTableModel {


	private HashMap<String, Term> model;

	public TableModelTerms() {
		...
	}
	
	public TableModelTerms(HashMap<String, Term> model) {
		this.model = model;
	}
	
	 public Class getColumnClass(int c) {
	        return getValueAt(0, c).getClass();
	    }
	
	public String getColumnName(int column){
		switch (column) {
		case 0:
			return "Term";
		case 1:
			return "Tf";
		case 2:
			return "Df";
		default:			
			break;
		}
		return "";
	}

	public int getRowCount() {
		if (model == null || model.isEmpty()) return -1;
		return model.size();
	}
	
	public int getColumnCount() {
		if (model == null || model.isEmpty()) return -1;
		return 3;
	}
	
	public Object getValueAt(int row, int column) {
		if (model == null || model.values().isEmpty()) return null;
		Object[] terms = model.values().toArray();
		
		Term term = (Term)terms[row];
		switch (column) {
		case 0:
			return term.getTerm();
			
		case 1:
			return term.getTtf();
			
		case 2:
			return term.getNoOfDocumentsOccursIn();
				
		default:
			break;
		}
		
		return null;
	}
}
 
> getValueAt(int row, int column) {
>
> Object[] terms = model.values().toArray();
> Term term = (Term)terms[row];

gewagt, wer garantiert, dass die Reihenfolge immer gleich ist?
und selbst falls intern nicht unbedingt für jeden Aufruf ein neues Array erzeugt wird, so klingt das doch immernoch nach einen unsauberen Weg,

schöner ist, die Terms einmal in ein Term-Array abzuspeichern
(nicht vergessen: bei Änderungen der Map neu initialsieren)

-------

die Map zeigt nur auf die Terms und sicherlich nicht mit dem Suchstring deiner gesuchten Spalte,
die hilft also gar nicht dabei,

du musst entweder bei dem langsamen Durchlauf bleiben, wobei getValue ja an sich so langsam ausschaut,
da wäre ein Durchauf durch ein festes Term-Array vielleicht schneller,

oder du legst einen Index in einer anderen Map an
String -> Int für die Zeilennummer
 
Ach mensch... danke für den Denkanstoß 🙂 Hallo Wald ich bin ein Baum.



Hier der neue Aufruf:

Code:
jTableTermList.changeSelection(model.getIndexOf(termKey), 0, false, false);

Geschwindigkeit = instant 🙂

und das passende Modell:

Code:
public class TableModelTerms extends AbstractTableModel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private ArrayList<String> keys;
	private HashMap<String, Term> model;

	public TableModelTerms() {		
	}
	
	public TableModelTerms(HashMap<String, Term> model) {
		this.keys = new ArrayList<String>();
		this.keys.addAll(model.keySet());
		this.model = model;
	}
	
	 public Class getColumnClass(int c) {
	        return getValueAt(0, c).getClass();
	    }
	
	public String getColumnName(int column){
		switch (column) {
		case 0:
			return "Term";
		case 1:
			return "Tf";
		case 2:
			return "Df";
		default:			
			break;
		}
		return "";
	}

	public int getRowCount() {
		if (model == null || model.isEmpty()) return -1;
		return model.size();
	}
	
	public int getColumnCount() {
		if (model == null || model.isEmpty()) return -1;
		return 3;
	}
	
	public Object getValueAt(int row, int column) {
		if (model == null || model.values().isEmpty()) return null;
		if (model.containsKey(keys.get(row))) {
			Term term = model.get(keys.get(row));
			switch (column) {
			case 0:
				return term.getTerm();				
			case 1:
				return term.getTtf();
			case 2:
				return term.getNoOfDocumentsOccursIn();
					
			default:
				break;
			}					
		}
		return null;
	}
	
	public int getIndexOf(String termKey) {
		return keys.indexOf(termKey);	
	}
}
 
oh, nur die Keys in einer Liste,
netter Schritt, vereinfacht die Sache,

keys.indexOf(termKey);
ist letztlich immer noch ein Array-Durchlauf mit Vergleichen,
mit ner Map String -> Int wärs schneller,

aber sieht so aus als kennst du solche Grundlagen 😉
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben