Jak zjistím, zda je číslo z množiny? – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak zjistím, zda je číslo z množiny? – Java – Fórum – Programujte.comJak zjistím, zda je číslo z množiny? – Java – Fórum – Programujte.com

 

Martin
~ Anonymní uživatel
1602 příspěvků
16. 5. 2014   #1
-
0
-

Zdravím, potřebuji vytvořit množinu červených čísel (z rulety) a následně zjistil zda se padlé číslo nachází v této množině. Nepotřebuji velké kusy kódu, opravdu mi jde jen o to, jak se zapisuje množina a jak se pak porovnává obyčejný integer s množinou...

Nahlásit jako SPAM
IP: 88.102.199.–
miHan0
Návštěvník
16. 5. 2014   #2
-
0
-

#1 Martin
Ahoj, možností máš povícero. Můžeš například použít pole (předem víš kolik prvků v té množině budeš mít) a to pak postupně projít a porovnat hodnotu v poli s tou co "padla". Další z možností je použít některou z kolekcí (například List)... 

Nahlásit jako SPAM
IP: 62.204.249.–
sleepy
~ Anonymní uživatel
422 příspěvků
16. 5. 2014   #3
-
0
-

Pouzi Set a v class-e prepis overridni hashcode() a equals(). 

class RouleteNumber {
	// len v pripade ze RouleteNumber je immutable
	// ak sa objekt da menit tak len vypocitas result a 
	// vratis hodnotu
	private volatile int hashCode
	private int number;
	private Color color;

	public RouleteNumber(int number, Colot color) {
		this.number = number;
		this.color = color;
	}

	public int getNumber() {
		return this.number;
	}

	public Color getColot() {
		return this.color;
	}

	@Override
	// vypocita sa hash cislo, ktore identifikuje dany objekt
	public int hashCode() {
		int result = hashCode;
		if (result == 0) {
			result = 17;
			result = 31 * result + number;
			result = 31 * result + (color != null? color.hashCode(): 0);
			hashCode = result;
		}
		return hashCode;
	}

	@Override
	// metodu equals potrebujes ak dva objekty maju rovnaky hash
	// v tom pripade sa vola equals a porovnavaju sa ich fieldy
	public boolean equals(Object o) {
		return o.getClass().equals(RouleteNumber.class) &&
			((RouleteNumber) o).number == number &&
			((RouleteNumber) o).color.equals(color);
	}
}

// potom uz len niekde v kode staci
Set<RouleteNumber> setOfNumbers = new HashSet<RouleteNumber>();

// a mas cislo napr. r
setOfNumbers.contains(r); // toto vrati boolean

// K otazke
Set<RouleteNumber> setOfRedNumbers = new HashSet<RouleteNumber>();
setOfRedNumbers.contains(r); // vrati boolean ak sa tam nachadza

HashSet funguje so zlozitostou O(1). Lebo mas obrovsky array objektou. Vypocita sa hash a pomocou neho sa vypocita pozicia v poli. Ak viacero roznich objektov (equals dava false) ma rovnaky hash, tak sa vytvori linkedlist na danej pozici tychto objektov. Vyhoda je rychlost a to ze objekty nemusia byt z dobre usporiadanej mnoziny ako pre treeset (progrmatorsky: nemusia implementovat Comparable).

Nahlásit jako SPAM
IP: 158.195.196.–
Flowy0
Věrný člen
16. 5. 2014   #4
-
0
-

#3 sleepy
on sa uci ako sa pouziva pole a ty mu spravis ukazku z collection a generics? sarkazmus?

Nahlásit jako SPAM
IP: 84.47.0.–
https://github.com/Flowy
sleepy
~ Anonymní uživatel
422 příspěvků
16. 5. 2014   #5
-
0
-

#4 Flowy
Ale nenapisal, ze zacina, alebo sa uci ako sa pouziva pole. Co ak vie, ako sa pouziva pole. Mozno hlada len riesenie tohto problemu, lebo sa s nim este nestretol. Pytal sa ako sa zapisuje mnozina a ako sa zistuje ci dany element patri do mnoziny. Na obe otazky som mu odpovedal + navod ako to ma urobit, aby to porovnavalo cislo a farbu a nie referencie. Cize nemyslim si, ze to bol sarkazmus. Ked bude velmi chciet moze si urobit vlastnu implementaciu Set-u. Napriklad tak, ze urobi to pole a za kazdym ho prebehne a porovna vsetky elementy metodou equals(Object o).

Nahlásit jako SPAM
IP: 158.195.196.–
Martin
~ Anonymní uživatel
1602 příspěvků
17. 5. 2014   #6
-
0
-

2 sleepy: Promiň, ale tvoje řešení je opravdu nad moje zkušenosti.

Navíc pokud jsi v javě zkušený, tak nechápu proč to děláš tak složitě, když to určitě musí jít mnohem jednodušeji.

Teď znovu: zjistil jsem (snad) jak udělat pole, takže mám toto

  int[ ] cerveny = { 1, 3, 5, 7, 9, 12, 14, 16,18,19,21,23,25,27,30,32,34,36 };

ale pak potřebuji dát tu podmínku a obyčejné porovnání integeru s polem nefunguje

if(pocitac==cerveny) prostě nefunguje... takže jak na to?

Nahlásit jako SPAM
IP: 88.102.199.–
Martin
~ Anonymní uživatel
1602 příspěvků
17. 5. 2014   #7
-
0
-

No tak nic, už se mi podařilo najít kód s for cyklusem, který postupně prohledá, zda je číslo z toho pole a funguje to :).

Nahlásit jako SPAM
IP: 88.102.199.–
Flowy0
Věrný člen
17. 5. 2014   #8
-
0
-

#5 sleepy

jak se zapisuje množina a jak se pak porovnává obyčejný integer s množinou...

Nahlásit jako SPAM
IP: 84.47.0.–
https://github.com/Flowy
Flowy0
Věrný člen
17. 5. 2014   #9
-
0
-

#6 Martin
ono to neni az tak zlozite a co je hlavne je to ovela obecnejsie riesenie ktore sa da pouzit takmer na cokolvek (dal by sa pouzit hashtree aby si mohol mat rovnake prvky) ak ti nevadi ze prvky budu zoradene ... o tom je OOP - ak maju rozne objekty rovnaku vlastnost (v tomto pripade ze sa daju porovnavat) tak by pre ne malo existovat spolocne riesenie

ak by ti vadilo zoradenie prvkov tak sa da pouzit aj viac obecnejsie riesenie (pomocou Collection ktora v pripade zoradeneho zdroja vyuzije zoradenost ale podporuje aj nezoradene) ale hladanie v zoradenej kolekcii je rychle

Nahlásit jako SPAM
IP: 84.47.0.–
https://github.com/Flowy
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý