schlimmer code?

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/schlimmer_code_111265/page_1 - zur Vollversion wechseln!


Römi schrieb am 05.04.2004 um 22:22

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


BuSHidO schrieb am 06.04.2004 um 15:40

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 schrieb am 06.04.2004 um 15:48

wenn wir schon dabei sind.....etwas längere variablen namen wären auch nett, nicht nur i,j,a,c,x.....


Römi schrieb am 06.04.2004 um 16:00

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)


BuSHidO schrieb am 06.04.2004 um 16:03

in perl gibts dazu list::compare :)


CitizenX schrieb am 06.04.2004 um 16:05

toString, zusammenhängen, zwei gegengleiche forschleifen zum aussortieren der doppelten und wieder arrayisieren
allerdings hab ich kaum ahnung von java :D


Römi schrieb am 06.04.2004 um 16:07

@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 schrieb am 06.04.2004 um 16:08

http://java.sun.com/j2se/1.3/docs/a....html#compareTo(java.lang.String)
hätt ich dacht


Römi schrieb am 06.04.2004 um 16:36

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 schrieb am 07.04.2004 um 02:58

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 schrieb am 07.04.2004 um 06:16

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


atrox schrieb am 07.04.2004 um 11:01

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 schrieb am 07.04.2004 um 12:20

ok, thx.

Edit:
da steht auch was dazu...
http://forums.devshed.com/archive/t-26392


Neo-=IuE=- schrieb am 07.04.2004 um 18:57

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;




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026