schlimmer code?
Römi 05.04.2004 - 22:22 787 13
Römi
Hausmeister
|
falls jemandem fad ist: ich hatte das Problem dass ich 2 Arrays hab befüllt mit int's die eine ID für einen gewissen Objekttyp sind. Ich wollte aus den 2en ein neues Array machen das keine doppelten ID's enthält aber eben alle die vorkommen. Der Code unten funktioniert, aber ich frage mich ob das nicht einfacher geht (siemlich sicher?). Außerdem hab ich das Problem dass teilweise '0'en als ID im fertigen Array auftauchen, das ist zwar fürs Prog. egal, aber ich wüsste gern woran das genau liegt... (Java) btw: geht euch das auch so dass ihr teilweise euren eigenen Code nicht versteht  ? Object[] nummer1 = liste1.getSelectedValues();
Object[] nummer2 = liste2.getSelectedValues();
int[] tmp1 = new int[nummer1.length];
int[] tmp2 = new int[nummer2.length];
int[] tmp3 = new int[nummer2.length+nummer1.length];
for(int i=0; i<nummer1.length; i++ ){
Worker t = (Worker)nummer1[i];
tmp1[i] = t.getId();
}
for(int i=0; i<nummer2.length; i++ ){
Worker t = (Worker)nummer2[i];
tmp2[i]= t.getId();
}
//ab hier ists interessant
int tmp_int = 0;
int main_counter = 0;
int sek_counter = 0;
while(main_counter< nummer2.length ){
boolean found = false;
for(int i=0; i<tmp1.length; i++){
tmp_int = tmp1[i];
if(tmp2[main_counter] == tmp1[i]){
tmp1[i]=-1;
found = true;
break;
}
}
if(found){
tmp3[sek_counter]=tmp_int;
sek_counter++;
}
else{
tmp3[sek_counter]=tmp2[main_counter];
sek_counter++;
}
main_counter++;
}
for(int j=0; j<tmp1.length; j++){
if(tmp1[j]!=-1 && tmp1[j]!=0){
tmp3[sek_counter]=tmp1[j];
sek_counter++;
}
}
//ab hier bubblesort
int b=0;
int tmp;
for(int i=tmp3.length-1; i>0; i--) {
for(int j=0; j<i; j++)
{
if( tmp3[j]>tmp3[j+1])
{
tmp=tmp3[j];
tmp3[j]=tmp3[j+1];
tmp3[j+1]=tmp;
}
}
}
//in tmp3 ist das ergebis
Bearbeitet von Römi am 06.04.2004, 16:05
|
BuSHidO
ist süß
|
ich verabscheue java und kann dir leider nicht helfen. allerdings würdest du dir ein paar zeilen sparen wennst die variablen sauber am anfang deklarieren würdest, wird dadurch auch lesbarer.
und würdest du gscheit dokumentieren kennst du dich später vielleicht auch aus. ich hab keine probleme ältere programme zu lesen.
|
ica
hmm
|
wenn wir schon dabei sind.....etwas längere variablen namen wären auch nett, nicht nur i,j,a,c,x.....
|
Römi
Hausmeister
|
Ja, ich weiß... Ich hab das mehr aus dem Bauch heraus geschrieben und mich nachher gewundert dass es funktioniert  es geht aber im prinzip nur darum aus 2 arrays eines zu machen in dem alle Elemente von beiden enthalten sind, aber nur einmal. Das System ist in etwa so dass ich ein array (tmp2) hernehm und schau ob es das element im anderen auch gibt, wenn ja kopier ichs in dritte und 'lösche' es(=-1) aus dem anderen (tmp1). zum schluss kopier ich alle nicht gelöschten ausm tmp1 ins fertige. Das ist nicht sehr schön finde ich, denn es könnte ja auch sein dass auch negative Zahlen vorkommen dürfen. Da gibt es sicher schon so einen 'lehrbuch' algorithmus... wahrscheinlich so ähnlich wie eine Sortierung. EDIT habs ein wenig nachgebessert (namen)
Bearbeitet von Römi am 06.04.2004, 16:05
|
BuSHidO
ist süß
|
in perl gibts dazu list::compare
|
CitizenX
Here to stay
|
toString, zusammenhängen, zwei gegengleiche forschleifen zum aussortieren der doppelten und wieder arrayisieren allerdings hab ich kaum ahnung von java
|
Römi
Hausmeister
|
@CitizenX aber was machst wenn du mehrstellige Zahlen hast?(ok, is wohl wurscht) Das toString auszusortieren wär eventuell mehr arbeit, aber ich habs noch nie versucht.
|
CitizenX
Here to stay
|
|
Römi
Hausmeister
|
hmm... aber 1.sollt es auch für andere Sachen gehn (wär zumindest toll) und 2. liefert ein .toString von einem Array doch etwas in der art: [1, 3, -6] und ich glaub man hat da mehr arbeit damit zu arbeiten als anders?
|
atrox
in fairy dust... I trust!
|
ein schönerer ansatz, könnte so aussehen, daß du beide listen vorher sortierst (aber bitte nicht mit bubble), und du tust dir beim zusammenfügen(zusammenmischen) der listen wesentlich einfacher, und kannst auch einfach doppelte entfernen.
oder du hängst zuerste beide zusammen, sortierst, und entfernst dann doppelte.
bedie male kann das entfernen der doppelten im letzten schritt (mit und ohne zusammenmischen) wesentlich effizienter erfolgen (mit linearem aufwand), als das druchsuchen des gesamten arrays, für jedes einzelne element (=quadratischer aufwand).
falls du nicht selbst einen quick- oder mergesort programmieren möchtest, schau dir java.util.Arrays.sort(...) an.
|
MightyMaz
hat nun auch einen Titel
|
Falls es sich eh nur um ganze Zahlen begrenzter (relativ kleiner) Größe handelt, ist die beste Sortiermethode immernoch ein bucketsort. Der ist viel leichter verständlich als ein Quicksort und nochdazu flotter in dem Fall (lineare Komplexität vs logarithmische beim Quick vs quadratische beim Bubble) Frißt zwar viel Speicher aber Speicher ist ja in unserer Zeit meist massig vorhanden
Bearbeitet von MightyMaz am 07.04.2004, 07:17
|
atrox
in fairy dust... I trust!
|
wie gesagt: wenn man java.util.Arrays.sort() verwendet, muß man sich nichtmal mehr darum kümmern... wer es allerdings selber machen möchte: im tutorial-thread finden sich passende links zu erklärungen.
|
Römi
Hausmeister
|
Bearbeitet von Römi am 07.04.2004, 13:00
|
Neo-=IuE=-
Here to stay
|
was mir nur noch einfällt: statt dem: tmp3[sek_counter]=tmp_int; sek_counter++;
schreibst glei (wenns wie in C is :P): tmp3[sek_counter++]=tmp_int;
|