Worst-Performance-Award für Arbeiten mit ListModel

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hallo...

ich hab grad ne Methode geschrieben, und ich kuck sie mir an und denke "oh mein gott :roll:"
Leider stell ich mich beim Arbeiten mit arrays usw immer sehr doof an, vllt geh ich auch das komplett
falsch an.

Hab ne JList, mit einem String[] model. Da man bei einem ListModel weder ein "add" noch "remove" hat, muss
ich mir das komplette Model immer neu machen, wenn ich etwas lösche oder adde.

Im Anhang meine grandiose Methode, die Elemente aus der Liste löscht. Wäre nett, wenn ihr mir da
ne bessere Version vorschlagt, ich stell mich bei sowas wie gesagt immer recht doof an, ich machs immer
unglaublich kompliziert, aber mir fehtl die Übung mit sowas. Bitteschön:

Code:
/* Neue Liste = alte Liste - selektierte Einträge */
			int[] selectedIndices = list.getSelectedIndices(); 
			int oldSize = list.getModel().getSize();
			int newSize = oldSize - selectedIndices.length;
			String[] newListModel = new String[newSize];
			int newIndex = 0;
			/* Liste kopieren bis auf selektierte Einträge */
			for (int i = 0; i < oldSize; i++) {
				/* Soll dieser Eintrag kopiert werden ? */
				boolean toCopy = true;
				for (int j : selectedIndices) {
					if (i == j) {
						// nicht kopieren, Element überspringen
						toCopy = false;
						break;
					}
				}
				if (toCopy) {
					// kopieren, es ist keines der selektierten Elemente:
					newListModel[newIndex] = (String) list.getModel()
							.getElementAt(i);
					newIndex++;
				}
			}
			/* Liste durch neue ersetzen und wieder an das ScrollPane hängen */
			list = new JList(newListModel);
			listPane.setViewportView(list);

Danke :toll:
 
S

stev.glasow

Gast
schau dir mal java.util an :p das ist zwar "Bauklötze bauen für Spielkinder" ;) mit bissel overhead aber wenn juckt das hierbei. find's lustig bei sowas auf performance zu achten, den unterschied merkt man eh nicht.
 

hdi

Top Contributor
lol, beginnt jetz das Thread-übergreifende Stalking ;) Ich hab auch nie gesagt, dass ich Bauklötze nich mag, sondern nur, dass es nun mal Fakt ist. Aber...hey... bitte, lassen Sie mich in Frieden, um Gottes Willen :cry:

edit: also ich bin etwas überfordert mit util. Was brauch ich hier? Ich hab n ListModel, dazu gibts nix in util, das einzige
was ich noch habe is ja ein Array. Aber irgendwie kann ich da keine Methode von brauchen.

Ich wollt's auch mit System.arraycopy machen, aber ich kann das ListModel nicht in ein Array casten. Sorry, dieser Tipp hilft mir grad irgendwie nicht weiter ???:L Ich brauch auch nich wirklich Methoden, die ne bessere Performance haben, auch wenn der Titel das sagt. Wär natürlich auch gut, aber vorallem sieht der code doch einfach total sch*** aus.
Diese Sache mit dem boolean dazwischen und so, ich weiss ja nicht.. Geht das nich kürzer?
 
S

stev.glasow

Gast
ich dachte jetzt so in der art:

Code:
List<Integer> selectedIndices = Arrays.asList(list.getSelectedIndices());
List<String> newListModel = new ArrayList<String>();
ListModel lmod = list.getModel();

for(int i = 0; oldSize.getSize(); ++i)
	if(!selectedIndices.contains(i)) 
		newListModel.add((String)lmod.getElementAt(i));

list = new JList(newListModel.toArray(new String[newListModel.size()]));
ist nicht getestet.

aber bau dir mal nen vernüftiges model - da die JList neu anzulegen verbraucht einiges mehr an ressourcen
 

hdi

Top Contributor
Code:
List<Integer> selectedIndices = Arrays.asList(list.getSelectedIndices());

geht leider nicht, weil er nicht von List<int[]> nach List<Integer> casten kann. Hab auch versucht
die for-schleife irgendwie anzupassen, krieg's aber so nich hin.

edit: Was meinst du mit "vernünftiges" Model? Wie sieht ein vernünftiges Model aus?
 
S

stev.glasow

Gast
hdi hat gesagt.:
Code:
List<Integer> selectedIndices = Arrays.asList(list.getSelectedIndices());
geht leider nicht, weil er nicht von List<int[]> nach List<Integer> casten kann.
hättest jetzt auch einfach ne ArrayList<Integer> anlegen können und dann die werte selber eingefügt.

hdi hat gesagt.:
Hab auch versucht die for-schleife irgendwie anzupassen, krieg's aber so nich hin.
Code:
int[] selectedIndices = list.getSelectedIndices();
// Arrays.sort(selectedIndices); [edit] kann raus
		
List<String> newListModel = new ArrayList<String>();
ListModel lmod = list.getModel();
	
int s = 0;
for(int i = 0; lmod.getSize(); ++i)
   if(s < selectedIndices.length && i == selectedIndices[s])
	   ++s;
   else	   
      newListModel.add((String)lmod.getElementAt(i));

list = new JList(newListModel.toArray(new String[newListModel.size()]));

hdi hat gesagt.:
Was meinst du mit "vernünftiges" Model? Wie sieht ein vernünftiges Model aus?
das interface ListModel selber implementieren - dann kannst auch einfach bestimmte elemente aus dem model entfernen, etc. musst mal im forum oder mit google suchen.
 

Marco13

Top Contributor
Ähm - warum eigentlich das gewurste mit einem eigenen ListModel und vor allem dem erstellen einer neuen JList :shock: ? Was spricht gegen ein DefaultMutableListModel? Da hat man alles, was man braucht, und braucht auch keine neue JList zu erstellen (was IMHO ziemlich murksig ist....)
 

hdi

Top Contributor
Du meinst DefaultListModel oder? Mutable gibts nicht, aber es ist veränderbar. Hab das jetz auch genutzt, und schwuppst sieht meine ganze Methode nun so aus:

Code:
			DefaultListModel listModel = (DefaultListModel) list.getModel();
			int i = 0;
			while ((i = list.getSelectedIndex()) != -1) {
				listModel.remove(i);
			}


Das is doch mal was :toll: Danke
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
N Java-Performance messen Java Basics - Anfänger-Themen 1
B Performance-Vergleich mit C++ Java Basics - Anfänger-Themen 55
P Priority Queue Performance Java Basics - Anfänger-Themen 3
P Performance Array und Liste Java Basics - Anfänger-Themen 13
S Performance von byte[], short[], int[]..? Java Basics - Anfänger-Themen 24
I Erste Schritte Resource Bundle - Alles in einem File oder mehrere? => Faktor Performance Java Basics - Anfänger-Themen 2
E Hilfe zur Performance Verbesserung gesucht Java Basics - Anfänger-Themen 1
G Performance - höhere Anzahl Swing Elemente Java Basics - Anfänger-Themen 5
S Performance-/Stress Test für Webanwendung Java Basics - Anfänger-Themen 2
R Datei kopieren: Performance erhöhen Java Basics - Anfänger-Themen 10
S Wie performance lastig sind rekursionen Java Basics - Anfänger-Themen 13
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
J Softwaresynthesizer Performance? Java Basics - Anfänger-Themen 11
I Anzahl einer Liste (Performance) Java Basics - Anfänger-Themen 2
J Performance Vergleich von if-Abfragen mit mehreren Bedingungen Java Basics - Anfänger-Themen 9
S Performance HashMap<=>Array Java Basics - Anfänger-Themen 17
J Arrays erweitern - Performance vs Speicherverbrauch Java Basics - Anfänger-Themen 6
M Einträge in Dateien zählen - Performance-Problem Java Basics - Anfänger-Themen 10
S unterschied in performance Java Basics - Anfänger-Themen 4
hdi Performance Frage (Threads,Swing) Java Basics - Anfänger-Themen 4
V Performance Lesen und Schreiben aus/in Streams Java Basics - Anfänger-Themen 4
C große Matrizen, Performance, (Pointer?) Java Basics - Anfänger-Themen 6
G import .; - Speicherauslastung, Performance Java Basics - Anfänger-Themen 14
G Performance Java Basics - Anfänger-Themen 18
C Performance IO vs. NIO Java Basics - Anfänger-Themen 5
S dynamic arrays/ performance Java Basics - Anfänger-Themen 2
RaoulDuke Arbeitsweise / Speichernutzung / Performance Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben