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

Otazka – Java – Fórum – Programujte.comOtazka – Java – Fórum – Programujte.com

 

emdzej
~ Anonymní uživatel
9 příspěvků
8. 4. 2015   #1
-
0
-

Mam spravit ulohu v jave a potrebujem si vybrat medzi 1.zoznam ako linearny zretazeny zoznam s referenciami na obsah alebo 2.front ako binárny súbor za podmienok spracovavane prvky budu heterogenne, vyuzitie objektovo orientovaneho programovania a pristup k heterogennym prvkom pomocou polymorfizmu co z toho je jednoduchsie spravit?

Nahlásit jako SPAM
IP: 158.193.102.–
ingiraxo+15
Grafoman
8. 4. 2015   #2
-
0
-

#1 emdzej
lineární seznam

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
emdzej
~ Anonymní uživatel
9 příspěvků
10. 4. 2015   #3
-
0
-

#2 ingiraxo
Vedel by si mi povedat ako to spravit polymorfne ked vyuzijem triedu Object tak to bude polymorfne?

public class Node {
   private Object item;
   private Node next;

   public Node(Object newItem) {
       item = newItem;
       next = null;
   } 
   public Node(Object newItem, Node nextNode) {
       item = newItem;
       next = nextNode;
   } 
    public void setItem(Object newItem) {
        item = newItem;
    } 
    public Object getItem() {
        return item;
    } 
    public void setNext(Node nextNode) {
        next = nextNode;
    } 
    public Node getNext() {
        return next;
    } 
}  

?

Nahlásit jako SPAM
IP: 158.193.102.–
ingiraxo+15
Grafoman
10. 4. 2015   #4
-
0
-

#3 emdzej
nebude, musel by si použít nějaký rozhraní místo objektu.. např. 

interface IObject {
    int getValue();
}

class Node {
    private IObject object;
    private Node next;
    
    // další...
}

Všechny třídy, který budou implementovat IObject bude možné používat v lineární seznamu a všechny objekty můžeš přetypovat na IObject a volat metodu getValue() s jinou implementací -> polymorf

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
ingiraxo+15
Grafoman
10. 4. 2015   #5
-
0
-

#3 emdzej
Takto třeba může vypadat jednoduchá funkční ukázka 

interface IMessage
{
    String getMessage();
}

abstract class AbstractMessage implements IMessage
{
    private final String message;

    public AbstractMessage(String message)
    {
        this.message = message;
    }

    @Override
    public String getMessage()
    {
        return message;
    }
}

final class InfoMessage extends AbstractMessage
{
    public InfoMessage()
    {
        super("Info Message");
    }
}

final class ErrorMessage extends AbstractMessage
{
    public ErrorMessage()
    {
        super("Error Message");
    }
}

final class Node
{
    private IMessage item;
    private Node next;

    public IMessage getItem()
    {
        return item;
    }

    public void setItem(IMessage item)
    {
        this.item = item;
    }

    public Node getNext()
    {
        return next;
    }

    public void setNext(Node next)
    {
        this.next = next;
    }
}

public class LinkedList implements Iterable<IMessage>
{
    private Node first;
    private Node current;

    public void add(IMessage msg)
    {
        Node node = new Node();
        node.setItem(msg);

        if (first == null) {
            first = node;
        } else {
            current.setNext(node);
        }
        current = node;
    }

    @Override
    public Iterator<IMessage> iterator()
    {
        return new Iterator<IMessage>()
        {
            private Node node;
            private boolean begin = true;

            @Override
            public IMessage next()
            {
                Node n = node;
                node = node.getNext();
                return n.getItem();
            }

            @Override
            public boolean hasNext()
            {
                if (begin) {
                    node = first;
                    begin = false;
                }
                return (node != null);
            }
        };
    }

    public static void main(String[] args)
    {
        LinkedList ll = new LinkedList();

        ll.add(new InfoMessage());
        ll.add(new ErrorMessage());

        Iterator<IMessage> it = ll.iterator();
        while (it.hasNext()) {
            System.out.println(it.next().getMessage());
        }
    }
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
emdzej
~ Anonymní uživatel
9 příspěvků
10. 4. 2015   #6
-
0
-

#5 ingiraxo
Ked pouzijem namiesto Object interface Comparable tak to bude polymorfne nie?

Nahlásit jako SPAM
IP: 158.193.102.–
emdzej
~ Anonymní uživatel
9 příspěvků
10. 4. 2015   #7
-
0
-

#6 emdzej
alebo Serializable

Nahlásit jako SPAM
IP: 158.193.102.–
ingiraxo+15
Grafoman
10. 4. 2015   #8
-
0
-

#7 emdzej
rozhodně ne... teoreticky při Comparable ano, ale je to nesmysl takto použít.. viz níže

pokud by si použil Serializable, tak tam sice budeš moct vložit všechny objekty, který impl. toihle rozhraní, ale nebudou mít žádné spoledné metody! Takže je to stejné, jako kdyby si použil Object

pokud použiješ Comparable, tak je to podobný, sice tam je nějaká metoda na porovnání, ale to je celý.. takový použití nedává smysl.. pokud potřebuješ, aby tam byli pouze objekty, který jdou porovnávat, tak vytvoř vlastní rozhraní, který rozšíříš o Comparable

čeho chceš vlastně dosáhnout?

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
emdzej
~ Anonymní uživatel
9 příspěvků
10. 4. 2015   #9
-
0
-

#8 ingiraxo
Potrebujem aby linked list obsahoval aspon 2 typy prvkov(napr. string,int...) pouzitim Object by sa tam dal vlozit lubovolny typ ale nie je to polymorfne. Ked vytvorim IObject ako si pisal tak ake triedy ho budu implementovat?

Nahlásit jako SPAM
IP: 158.193.102.–
ingiraxo+15
Grafoman
10. 4. 2015   #10
-
0
-

#9 emdzej
koukal ses vůbec na tu ukázku co jsem posílal? Tam je přesně to, co potřebuješ včetně těch 2 typů. (abstraktní třída není nutná, jen je to lepší)

zjednodušená verze může být třeba tak, že rozhraní bude mít metodu na vypsání nějakého textu do konzole... potom vytvoříš 2 třídy, který naimplementujou rozhraní a ty třídy potom vložíš do listu 

interface IObject {
    void print();
}

class ClassA implements IObject {
    @Override public void print() {
        System.out.println(getClass().getSimpleName());
    }
}

class ClassB implements IObject {
    @Override public void print() {
        System.out.println(getClass().getSimpleName());
    }
}

nebo (stejný a lepší kód než výše)

interface IObject {
    void print();
}

abstract class AbstractObject implements IObject {
    @Override public void print() {
        System.out.println(getClass().getSimpleName());
    }
}

class ClassA extends AbstractObject {}
class ClassB extends AbstractObject {}

A implementovat rozhraní budou takový třídy, který budeš chtít vložit do listu... můžeš samozřejmě udělat složitější konstrukci a přidat generiku, potom budeš moct vložit do listu třeba int a string zabalený ve vlastním objektu

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
emdzej
~ Anonymní uživatel
9 příspěvků
10. 4. 2015   #11
-
0
-

#10 ingiraxo
Pozeral pokial som neuvidel iterator a iterable lebo to neviem pouzivat

Nahlásit jako SPAM
IP: 158.193.102.–
emdzej
~ Anonymní uživatel
9 příspěvků
16. 4. 2015   #12
-
0
-

Ten iterator je tam kvoli tomu aby zlozitost bola O(1)? Ked pouzijem cyklus for v metode tak zlozitost nemoze byt O(1)?

Nahlásit jako SPAM
IP: 158.193.86.–
ingiraxo+15
Grafoman
16. 4. 2015   #13
-
0
-

#12 emdzej
se složitostí to nemá nic společnýho, samozřejmě tam iterátor být nemusí, mám ho tam jen proto, aby se dalo se seznamem líp pracovat.. hlavně aby si nepracoval s nodem jako takovým, ale s tím rozhraním

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
emdzej
~ Anonymní uživatel
9 příspěvků
16. 4. 2015   #14
-
0
-

#13 ingiraxo
Ked pridavam prvok do zoznamu na konkretne miesto a vyuzivam pri tom cyklus for tak zlozitost je O(n)?

Nahlásit jako SPAM
IP: 158.193.86.–
ingiraxo+15
Grafoman
16. 4. 2015   #15
-
0
-

#14 emdzej
u linked listu je problém, že nepodporuje indexování, takže když chceš insertnout prvek mezi dva nody, tak musíš ručně projit (vždy procházíš od začátku) až k tomu nodu a tam přidat novej nod... nejhorší je vkládat předposlední node, tam musí logika projít všechny prvky

samozřejmě jsou způsoby i prostor pro optimalizaci, např. že node bude držet pozici i rodičovského nodu, to ti potom umožní procházet nody i od konce, ale pokud to k něčemu nepotřebuješ, tak to nedělej

vždy si musíš držet první nod a je dobrý držet i poslední, což mám taky v ukázce

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
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, 10 hostů

Podobná vlákna

Otázka — založil Dramamine

Otazka — založil CJ

Otazka — založil A-dy

Otázka — založil adamislav01

Programovanie c++ otázka — založil toso992

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ý