"We are back" « oc.at

schlimmer code?

Römi 05.04.2004 - 22:22 787 13
Posts

Römi

Hausmeister
Avatar
Registered: Feb 2001
Location: Bez. Tulln
Posts: 5377
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 ;)?

Code: PHP
		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üß
Registered: Jul 2001
Location: galaxie
Posts: 542
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
Avatar
Registered: Jul 2002
Location: Graz
Posts: 9845
wenn wir schon dabei sind.....etwas längere variablen namen wären auch nett, nicht nur i,j,a,c,x.....

Römi

Hausmeister
Avatar
Registered: Feb 2001
Location: Bez. Tulln
Posts: 5377
Ja, ich weiß... :rolleyes:
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üß
Registered: Jul 2001
Location: galaxie
Posts: 542
in perl gibts dazu list::compare :)

CitizenX

Here to stay
Avatar
Registered: Nov 2002
Location: Wien
Posts: 989
toString, zusammenhängen, zwei gegengleiche forschleifen zum aussortieren der doppelten und wieder arrayisieren
allerdings hab ich kaum ahnung von java :D

Römi

Hausmeister
Avatar
Registered: Feb 2001
Location: Bez. Tulln
Posts: 5377
@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
Avatar
Registered: Nov 2002
Location: Wien
Posts: 989

Römi

Hausmeister
Avatar
Registered: Feb 2001
Location: Bez. Tulln
Posts: 5377
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!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
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
Registered: Feb 2003
Location: .de
Posts: 681
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 :D
Bearbeitet von MightyMaz am 07.04.2004, 07:17

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
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
Avatar
Registered: Feb 2001
Location: Bez. Tulln
Posts: 5377
ok, thx.

Edit:
da steht auch was dazu...
http://forums.devshed.com/archive/t-26392
Bearbeitet von Römi am 07.04.2004, 13:00

Neo-=IuE=-

Here to stay
Registered: Jun 2002
Location: Berndorf, NÖ
Posts: 3236
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;
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz