Objekt v objekte – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Objekt v objekte – Java – Fórum – Programujte.comObjekt v objekte – Java – Fórum – Programujte.com

 

zakkly
~ Anonymní uživatel
3 příspěvky
22. 3. 2014   #1
-
0
-

   

Ahoj, potreboval by som poradiť s týmto cvičením. Myslím hlavne tú prvú úlohu, kde mám vytvoriť triedu SpojovySeznam a v nej metódu vloz(Object obj). Stačí mi to len zhruba vysvetliť ako mám v inštancii tej triedy uchovať Object a ako zhruba napísať tú metódu. A tak isto metóda vyjmiPrvniho() , ako na to ? Jediný spôsob, ktorý mi napadá je využiť niečo ako firstChild(ako sa to dá v CSS), ale neviem či také niečo existuje aj v Jave.
Ďakujem. 

Nahlásit jako SPAM
IP: 88.212.40.–
Zdenda
~ Anonymní uživatel
257 příspěvků
23. 3. 2014   #2
-
0
-

#1 zakkly
V zadání není určeno, jak se má implementovat vlastní ukládání, takže bych využil Queue. V Queue jsou možnosti přístupu přes add/remove/element (vyhazují výjimky) a offer/poll/peak (vrátí null). V metodě vyjmiPrvniho si to ošetři, aby splnil zadání:

if (queue.isEmpty()) {
    throw new SeznamException();
} else {
    return queue.remove(); // alternativně queue.poll()
}
Nahlásit jako SPAM
IP: 84.16.127.–
Flowy0
Věrný člen
23. 3. 2014   #3
-
0
-

mam taky pocit ze by nemal pouzivat kniznice (to tvoje riesenie by bolo praktickejsie keby proste vytvoril triedu ktora rozsiruje potrebnu queue - pravdepodobne linkeddeque - a len doplnil metody (prelozene ak je to nutne) s tym ze by vyuzival priamo metody zo super)...

najjednoduchsie to bude asi tak ze si spravis jeden objekt ktory bude mat zaroven odkaz na dalsi a tiez predchadzajuci objekt (kedze to ma byt spojove) a zaroven vlastnu premennu do ktorej ulozis objekt ktory potrebujes ... k nej nadefinujes metody ako getLast() getFirst() - tychto spoznas tak ze v nasledujucom/predchadzajucom objekte budu mat null ... nad tymto objektom mozes este definovat inu triedu ktora by to spravovala (prostrednik) ... ta by pre ulacenie mohla obsahovat premenne ako aktualny pocet objektov v rade odkaz na prvy odkaz na posledny a tiez by bola dobra do buducnosti ak by si sa rozhodol zmenit implementaciu (napr spravit spojovy zoznam ale jednotlive objekty by boli ukladane do array a tieto by boli spojovane cize by si usetril nejaky cas pri praci s velkymi retazcami - tak isto ako je StringBuilder) ... ak ste sa ucili co je interface tak by som jeden nad tymto este definoval nech je to este krajsie

Nahlásit jako SPAM
IP: 95.102.43.–
https://github.com/Flowy
zakkly
~ Anonymní uživatel
3 příspěvky
23. 3. 2014   #4
-
0
-

No v škole na informatike tak maximalne vykresľujeme kvietky do Canvasu v pascale :D ,
ale o rozhraniach som už niečo počul. Toto zadanie je vlastne len také cvičenie pre mňa takže nezáleží veľmi na tom ako sa to spraví. Avšak v programovaní som noob a teraz sa snažím pochopiť ako pracovať s objektami atď. 

Ďakujem za odpoveď, ale musím priznať, že som to veľmi nepochopil :( . Má to byť tak že si vytvorím objekt napr. spojZoznam a do neho budem vkladať ďalšie objekty? Keď si vytvorím Object c = new Object() tak ho viem vložit iba tak že budem mať v triede SpojovyZoznam premenu   a a vo funkcii vloz() bude: a = obj ; A to je dosť blbý spôsob  

Nahlásit jako SPAM
IP: 88.212.40.–
NotBeginner
~ Anonymní uživatel
185 příspěvků
24. 3. 2014   #5
-
0
-

 Zde je zakladni kostra prvniho ukolu abys ses měl z čeho odrazit. Samozřejmě nemusí být použito dynamické pole(kolekce ArrayList ale normální pole  ... např. Object [] poleObjekt = new Object[velikost]; a všechno musís vyřešit přes indexy )

class SpojovySeznam{
	private ArrayList<Object> seznam;		// deklarace
	SpojovySeznam(){				// konstruktor
		seznam = new ArrayList<Object>();	// vytvorime objekt
	}
	private void vloz(Object o) {			// vlozime objekt tridy Object do seznamu
		seznam.add(o);
	}
	private void vypisSeznam(){
	 .... zde naprogramuj iterator pro pruchod kolekci
	}
	....zde metodu pro vyber objektu z kolekce

}
Nahlásit jako SPAM
IP: 217.112.161.–
Flowy0
Věrný člen
24. 3. 2014   #6
-
0
-

#5 NotBeginner
tvoje riesenie je totalne off topic ...

ak dana trieda ma sluzit rovnako ako arraylist tak nema zmysel aby sama obsahovala arraylist ...

class SpojovySeznam extends ArrayList<Object> {
	private void vloz(Object o) {
		super.add(o);
	}
	private void vypisSeznam() {
		...
	}
	...
	@Override
	public neviem add(Object o) {
		super.add();
		alebo prepisat funkcionalitu ako chces
	}
}

kazdopadne taketo riesenie nema zmysel pre dane zadanie (nic sa nim nenauci - resp sa nenauci to co bolo cielom)

ak by pouzil namiesto arraylist bezny array tak by to uplne menilo situaciu (musel by prepojovat viac poli) ... taketo riesenie by uz malo zmysel ale bolo by zbytocne (znizilo by narocnost pri hladani ale pre dane zadanie nepodstatne a stazovalo by to nazornost ... mozno vhodne ako bonusove zadanie) zlozite

ak ma dana uloha aspon nieco naucit (okrem zoznamenia sa s collections) tak by sa mala implementovat od zakladov ... tieto su jednoduchsie ako sa zda

public class List { //chapat ako list zo stromu (binarneho a pod) ... tiez mozne nazvat node a podobne
	private Object main = null; //samotny objekt ktory bolo v plane ulozit (pri rozsireni by sa pouzilo pole ale museli by sa tiez upravit getter metody) ... pozor na to ze do Object sa neda ulozit int, double, char a pod ... musis pouzit ich wraper objekty teda Integer, Double, Character ... (toto ale zatial nemusis riesit pretoze java to vie medzi nimi automaticky konvertovat)
	private List next = null;
	private List previous = null;
	List(Object o) {
		this.main = o;
	}
	boolean hasNext() {
		boolean result = false;
		if (this.next != null) {
			result = true;
		}
		return result;
	}
	List getLast() {
		List last = this;
		while (this.hasNext()) {
			last = this.getNext();
		}
		return last;
	}
	void add(List list) {
		List actualLast = this.getLast();
		actualLast.next = list; //najde posledneho a do jeho polozky next ulozi odkaz na list ktory mal byt posledny
		//nutne tiez pridat do posledneho listu odkaz na predchadzajuci
	}
	//praktickejsie ale asi bude namiesto prijmu priamo listu pouzit Object a ten zabalit do novo vytvoreneho listu
	void add(Object object) {
		List actualLast = this.getLast();
		actualLast.next = new List(object);
	}
	
	public static void main(String[] args) {
		List zoznam = new List(new Object());
		zoznam.add(new Object());
	}
}

zakladnu predstavu snad dostanes z tohto ... pre definiciu spojovy zoznam nepotrebujes pridavat odkaz na predchadzajuci objekt (to by bol potom obojstranne spojovy zoznam) ale odporucam ti skusit si to ... pracu s objektmi si ovela lepsie uvedomis ked budes pisat remove pre obojstranny zoznam (a tiez sa ti hodi ked budes robit sort-y)

tym interface som myslel to ze by si vytvoril inu triedu(napr Tree/Zoznam/List) ktorej ulohou bude umoznit vytvorenie zoznamu pred samotnym vkladanim objektov a zrychlenie napr sposobom ze bude mat ulozeny nejaky cache na najcastejsie volane objekty a pod (tiez pre jednoduche triedenie) ... tymto by si sa dostal na uroven ArrayList / LinkedDeque a podobnych ... keby si nad tym definoval este skutocny interface tak by si sa dostal na uroven ako je v Jave - takyto interface je napr Collection - definuje zakladne metody ktore kazdy zo zoznamov musi obsahovat (menovite) to ti umozni ze ked nebudes potrebovat nejake specialne funkcie (perma usporiadanie a pod) tak si definujes metodu napr takto 

public boolean isContained(Collection col) { //tu ti bude pisat varovanie ze mas definovat akej generickej triedy musi byt kolekcia - bude obsahovat len objekty daneho typu napr Collection<String> col
	boolean result = false;
	for (String string: col) {
		if (this.equals(string)){
			result = true;
		}
	}
	return result;
}

a do takejto metody mozes posielat vsetky objekty ktore su pod collection (najdes v linku ako All Known Implementing Classes)

pripadne sa mozes este zahrat a skusit si tvoju verziu zoznamu implementovat pod collection (Zoznam implements Collection) a uvidis ako funguje dedicnost (jej uloha je vysvetlena vyssie)

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

Najlepsie ked si pozeres ako Bloch implementoval LinkedList v Jave. Ten kod je uhladne rozpiasny a mam pocit, ze to je podstatou toho cvicenia. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/LinkedList.java. Ale to co tebe staci:

class SpojovySeznam<E>{
	private class Node<E>{
		E element;
		Node prev, next;
		
		public Node(E element, Node prev, Node next) {
			this.element = element;
			this.prev = prev;
			this.next = next
		}

		public E element() {
			return this.element;
		}

		public E remove() {
			E ret = this.element;
			if(prev != null)
				prev.next = next;
			if(next != null)
				next.prev = prev;
			next = null;
			prev = null;
			element = null;
			return ret; // ide to aj cez try finally
		}
	}
	private Node<E> first, last;
	private int size;
	
	// Konstruktor

	public void vloz(E element) {
		if (last == null){
			first = new Node(element, null, null);
			last = new Node(element, first, null);
			first.next = last;
			siez++;
		} else {
			Node<E> n = new Node(element, last, null);
			last = n;
		}
	}

	public E vyjmiPrvniho(){
		Node next = firs.next;
		E element = first.remove();
		first = next;
		return element;
	}

	public void vypisSeznam() {
		Node<E> n = first;
		if (n == null){
			// Hodis vynimku o prazdnom liste.
			// Tych vynimiek by sa tu hodilo viac ale nechcelo sa mi.
			// Najlepsie ked pochopis, ako funguje LinkedList.
			// Ten je napisany naozaj dobre.
		}
		while(n.next != null){
			// Tu vypises co sa tam nachadza v danom node

			n = n.next; // Skocis na dalsi node.
		}
	}

}


Su tam chyby, ale ma to sluzit iba ako demonstracia toho, ako to jednoducho vytvorit. A este som si vsimol ze som pouzitl generika. Staci aby si namiesto "E" dal "Object" a vsetky "<E>" vymazal.

Nahlásit jako SPAM
IP: 158.195.196.–
zakkly
~ Anonymní uživatel
3 příspěvky
27. 3. 2014   #8
-
0
-

#7 sleepy
#6 Flowy

Ďakujem obidvom , idem si to naštudovať.

Nahlásit jako SPAM
IP: 88.212.40.–
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, 3 hosté

Podobná vlákna

UniquePrintable objekt — založil JerryM

Objekt s číslem — založil Paulí

Ukazovatel na objekt — založil Anonymní uživatel

Objekt cin — založil q

Objekt a polia? — založil WraCkeR

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ý