Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java-funktio, joka poistaa duplikaatit

feder [18.09.2012 19:57:33]

#

Koitan tehdä metodia joka poistaisi duplikaatit arvot, eli esim. jos syötän 1 2 3 4 1 2 5 niin ulos tulee 1 2 3 4 5. Mikä tässä on pielessä, miksi newList ei saa noita listin arvoja?

public static int[] removeDuplicates(int[] list) {
	int[] newList = new int[10];
	int newLength = 0;
	for(int i=0;i<list.length;i++) {
		for(int j=0;j<newLength;j++) {
			if(list[i]!=newList[j]) {
				newList[newLength] = list[i];
				newLength++;
			}
		}
	}
return newList;
}

-tossu- [18.09.2012 20:44:36]

#

Vika löytyy melko helposti, mikäli seuraat ohjelman toimintaa mielessäsi. Nythän sisempi silmukkasi käy kaikki newListin alkiot läpi, ja lisää listin alkion newListiin joka kerta, kun läpikäytävien alkioiden arvot ovat eri.

Voit ottaa tästä pseudokoodina toimivasta Python-koodista mallia:

for i_item in list:
	exists_already = False
	for j_item in newList:
		if i_item == j_item:
			exists_already = True
			break

	if not exists_already:
		newList.append(i_item)

Grez [18.09.2012 21:29:53]

#

Mua hämää suunnattomasti että parametrin nimi on lista, vaikka sille kuitenkin annetaan taulukko.

Toisekseen mua hämää paljon tuo, että jos tuloksen pituus onkin yli 10 yksilöä, niin pusketaan poikkeusta. Mielestäni taikanumeroita ei pitäisi käyttää ollenkaan ja jos on ihan pakko (tässä tapauksessa ei ainakaan ole) niin sitten hyvät selitykset kommenttiin.

Eikö tuon voisi tehdä näin:

public static int[] removeDuplicates(int[] items) {
  return (new HashSet(items)).toArray();
}

feder [19.09.2012 14:07:38]

#

Tämä on harjotus yhdestä Java-kirjasta ja siinä parametrin nimi on list joten en voi asialle mitään. Harjotuksessa vain java.util.Scanner luokka on sallittu. Tuota Python-koodia en oikein ymmärrä.

johku90 [19.09.2012 16:25:49]

#

Koodisi ei käy läpi ollenkaan tuota sisempää for-luuppia, koska newLength on alustettu nollaksi.

qeijo [19.09.2012 16:54:04]

#

Tarkista removeDuplicates funktiossa for - loopissa, onko arvo taulussa jos ei ole niin lisää se. Niin ja ehkä olisi dynaamisempi vaihtoehto käyttää listoja, ainakin uuden taulukon kohdalla vähintäänkin siihen asti että se palautetaan.

public static boolean in_array(int[] taulukko, int estsittavaArvo) {

    for(int i = 0; i < taulukko.length; i++) {

        if(taulukko[i] == estsittavaArvo)
            return true;
    }

	return false;
}

Grez [19.09.2012 17:04:19]

#

qeijo kirjoitti:

ehkä olisi dynaamisempi vaihtoehto käyttää listoja

Niin no sitten varmaan samantien HashSet, mutta:

feder kirjoitti:

Harjotuksessa vain java.util.Scanner luokka on sallittu.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta