Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα, σε συνεχεια αυτου του θεματος:

 

Εχω να φτιαξω εναν πινακα 4 θεσεων, οπου καθε θεση απο τις 4 θα δειχνει στον πρωτο κομβο μιας απλα συνδεδεμενης ταξινομημενης λιστας ( 4 λιστες εχουμε συνολο, για αυτο και οι 4 θεσεις του πινακα ).

 

Εχω καταλαβει και εχω δοκιμασει το οτι εστω οτι εχω μια λιστα List με κομβους Node, ο πινακας θα ειναι πχ:

List.Node[] A = new List.Node[4].

και εχω μια μεθοδο getHead στην κλαση της λιστας οπου μου επιστρεφει τον πρωτο κομβο καθε φορα.

 

Ομως παραδειγματος χαριν ο κωδικας

List a = new List();
List b = new List();
List c = new List();
List d = new List();

A[0] = a.getHead();
A[1] = b.getHead();
A[2] = c.getHead();
A[3] = d.getHead();

Αυτο δεν μου δουλευει ομως και η αληθεια ειναι οτι εχω μπερδευτει πολυ στο πως θα κανω αυτην την αναθεση που πρεπει. Εχω φτιαξει την κλαση της ταξινομημενης απλα συνδεδεμενης λιστας, και μπορω και λυνω το προβλημα χωρις την λυση του πινακα απλα χρησιμοποιωντας την a,b,c,d λιστες που χρειαζομαι. Ομως η εργασια απαιτει την χρηση του πινακα, οποτε...Καθε βοηθεια ευπροσδεκτη! :)

 

Δημοσ.

Η getHead() δεν επιστρέφει List.Node άλλα object.

http://jse.sourceforge.net/doc/api/net/sf/jse/List.html#getHead()

 

Την getHead την εχω φτιαξει εγω και επιστρεφει Node. Δεν χρησιμοποιησα καποια ετοιμη. Παρερμηνευτικα :-)

 

Δεν εχει κανεις καμια ιδεα πως θα κανω αυτο που μου ζητειται;

Δημοσ.

Καταρχάς, σου πετάει κάποιο error όταν το τρέχεις ή κάτι άλλο; αν μας πεις θα μπορέσουμε να βοηθήσουμε.

Δεύτερο, αν θυμάμαι καλά, η List.Node είναι εσωτερική κλάση της List και δεν θα πρεπε με τίποτα να την χρησιμοποιήσεις. Ίσως εκεί είναι το πρόβλημά σου.

Δημοσ.

Κάτι τέτοιο ?

ArrayList<Νode> t =new ArrayList();

t.add(a.getHead);
t.add(a.getHead);
t.add(a.getHead);
t.add(a.getHead);

Η κάτι τέτοιο ?

Node[] p=new Node[4];
p[0]=a.getHead;
p[1]=a.getHead;
p[2]=a.getHead;
p[3]=a.getHead;

άσχετο αλλά το

List a = new List();

δεν πρόκειται να σου κάνει compile

Δημοσ.

Συγνωμη αλλα ξεχασα να αναφερω οτι δεν επιτρεπεται να χρησιμοποιησουμε ArrayList.

 

Επισης, η κλαση List ειναι μια κλαση που εχω φτιαξει εγω, και το List() αποτελει εναν constructor που εχω φτιαξει εγω.

 

Μεσα στην κλαση List εχω την κλαση Node που εχει μεσα της τα στοιχεια που θελω να υπαρχουν σε καθε κομβο της λιστας.

 

Επισης, δεν μου πεταει καποιο error στους 2 κωδικες που αναφερω στο πρωτο ποστ, απλα δεν μου δουλευει οπως πρεπει, εγω αυτο που θελω ειναι καθε θεση του πινακα ( 0-3 ) να δειχνει στον πρωτο κομβο της αντιστοιχης λιστας ( a - d ). Τονιζω το να δειχνει, οχι να ισουται, διοτι αυτο λεει η ασκηση και απο οτι καταλαβαινω εφοσον θελει να δειχνει, θα μπορουμε μεσω του πινακα να εχουμε προσβαση σε ολοκληρη την λιστα.

Δημοσ.

Το προγραμμά σου παίζει . Έκανα ενα proof of concept με μια custom LinkedList να γυρνάει Node και πήρα την τιμή απο το δεύτερο στοιχείο της λίστας χωρίς πρόβλημα

LinkedList1<Integer> a = new LinkedList1();
a.add(1);
a.add(2);
a.add(3);
        
LinkedList1.Node<Integer> []t=new LinkedList1.Node[4];      

t[0]=a.getHead();
        
System.out.println(t[0].next.item);

Η ερώτηση βέβαια είναι τι θα γίνει σε περίπτωση που αφαιρέσουμε το πρώτο στοιχείο απο την λίστα ...

Δημοσ.

Δεν ξερω ακριβως την υλοποιηση ουτε τι κανει αυτο για να ειμαι ειλικρινης:

<Integer>

Τελος παντων, οριστε ενα τμημα του κωδικα που εχω γραψει σε μορφη τεστ, μηπως βοηθησει καπως:

 

Η κλαση:

 

 

public class List {
    
    public class Node {
        

        protected int a;
        protected int b;
        protected int c;
        protected int[] choices = new int[3];
        protected Node next;
     
        
        public Node(int cc, int aa, int dd, int p1, int p2, int p3, Node next1)
        {
            a = cc;
            b = aa;
            c = dd;
            choices[0] = p1;
            choices[1] = p2;
            choices[2] = p3;
            next = next1;
        }
        
    }

    
    private Node head;
    public List()
    {
        head = null;
    }
    
    public void addToStart(int c, int a, int d, int p1, int p2, int p3)
    {
        head = new Node(c,a,d,p1,p2,p3, head);
    }
    
    public Node getHead()
    {
        return head;
    }

    
    
    public class Listiterator
    {
        private Node position;
        private Node previous;

        public void addHere(int c, int age, int d, int p1, int p2, int p3)
        {
            if(position == null && previous != null)
            {
                previous.next = new Node(c,a,d,p1,p2,p3,null);        
            }
            else
            {
                Node temp = new Node(c,a,did,pid1,pid2,pid3,position);
                previous.next = temp;
                previous = temp;
            }
            
        }
        
        public int getC()
        {
            return position.cid;
        }
        
        
        public Listiterator()
        {
            position = head;
            previous = null;
        }
        
        public void restart()
        {
            position = head;
            previous = null;
        }
        
        public String next()
        {
            String toReturn = "";
            toReturn += Integer.toString(position.c);
            toReturn += "   ";
            toReturn += Integer.toString(position.a);
            toReturn += "   ";
            toReturn += Integer.toString(position.d);
            toReturn += "   ";
            toReturn += Integer.toString(position.choices[0]);
            toReturn += "   ";
            toReturn += Integer.toString(position.choices[1]);
            toReturn += "   ";
            toReturn += Integer.toString(position.choices[2]);
            previous = position;
            position = position.next;
            return toReturn;        
        }
        
        public void goNext()
        {
            previous = position;
            position = position.next;
        }
        
        public int hasNext()
        {
            if(position != null)
                return 1;
            else
                return 0;
        }
        
        public int hasNextone()
        {
            if(position.next != null)
                return 1;
            else
                return 0;
        }
        
        
    }
    
    public Listiterator iterator()
    {
        return new Listiterator();
    }
    
}

 

 

 

 

και ενα TEST για να εισαγουμε στην λιστα με ταξινομημενο τροπο:

 

 

 

public class test {
    
    static List list1 = new List();
    static List.Listiterator i1 = list1.iterator();    
    
    static List list2 = new List();
    static List.Listiterator i2 = list2.iterator();    
    
    static List list3 = new List();
    static List.Listiterator i3 = list3.iterator();    
    
    static List list4 = new List();
    static List.Listiterator i4 = list4.iterator();    

    static List.Node[] listes = new List.Node[4];
    
    
    public static int letter_received(int c, int a, int d, int p1, int p2, int p3) {

        listes[0] = list1.getHead();
        listes[1] = list2.getHead();
        listes[2] = list3.getHead();
        listes[3] = list4.getHead();

        
        if(a<=3)
        {
            i1.restart();
            if(i1.hasNext() == 0)
            {
            list1.addToStart(c, a, d, p1, p2, p3);
            } else
            {
                while(i1.hasNext() == 1)
                {
                    if(i1.getC() < c)
                    {
                        if(i1.hasNextone() == 0)
                        {
                        i1.goNext();
                        i1.addHere(c, a, d, p1, p2, p3);
                        }
                        else
                            i1.goNext();
                    }
                    else
                        list1.addToStart(c, a, d, p1, p2, p3);
                    }
                
            }
        } else if (a<=7)
        {
            i2.restart();
            if(i2.hasNext() == 0)
            {
            list2.addToStart(c, a, d, p1, p2, p3);
            } else
            {
                while(i2.hasNext() == 1)
                {
                    if(i2.getC() < c)
                    {
                        if(i2.hasNextone() == 0)
                        {
                        i2.goNext();
                        i2.addHere(c, a, d, p1, p2, p3);
                        }
                        else
                            i2.goNext();
                    }
                    else
                        list2.addToStart(c, a, d, p1, p2, p3);
                    }
                
            }
        } else if (a<=11)
        {
            i3.restart();
            if(i3.hasNext() == 0)
            {
            list3.addToStart(c, a, d, p1, p2, p3);
            } else
            {
                while(i3.hasNext() == 1)
                {
                    if(i3.getC() < c)
                    {
                        if(i3.hasNextone() == 0)
                        {
                        i3.goNext();
                        i3.addHere(c, a, d, p1, p2, p3);
                        }
                        else
                            i3.goNext();
                    }
                    else
                        list3.addToStart(c, a, d, p1, p2, p3);
                    }
                
            }
                
            
        } else if (a<=15)
        {
            i4.restart();
            if(i4.hasNext() == 0)
            {
            list4.addToStart(c, a, d, p1, p2, p3);
            } else
            {
                while(i4.hasNext() == 1)
                {
                    if(i4.getC() < c)
                    {
                        if(i4.hasNextone() == 0)
                        {
                        i4.goNext();
                        i4.addHere(c, a, d, p1, p2, p3);
                        }
                        else
                            i4.goNext();
                    }
                    else
                        list4.addToStart(c, a, d, p1, p2, p3);
                    }
                
            }
        }
        
        
        return 1;
    }

 

 

 

Αυτο που θα ηθελα ειναι αν μπορουσα να κανω τα ιδια πραγματα οχι χρησιμοποιωντας list1 list2 αλλα τον πινακα. Δεν ξερω αν γινομαι κατανοητος.

Δημοσ.

Εδώ σε εχω :-D

LinkedList<Integer> a  =new LinkedList();
a.add(1);
a.add(2);
a.add(3);

//References to lists        
LinkedList[] arr=new LinkedList[4];
arr[0]=a;
        
ListIterator ltr = arr[0].listIterator();
        
while(ltr.hasNext())
{
      System.out.println(ltr.next());
}

Αν θές να φτιάξεις την λογική απο Node θα καταλήξεις να υλοποιήσεις λειτουργικότητα της λίστας πάλι

 

Δημιουργία Λίστας μόνο απο Nodes και εκτύπωση

Node[] arr = new Node[10];
arr[0]=new Node(null,0,null);

for (int i=1; i < 10; i++)
{
    arr[i]=new Node(arr[i-1],i,null);
    arr[i-1].next=arr[i];
}

Node prn = arr[0];

while (prn.next!=null)
{
    System.out.println(prn.item);
    prn=prn.next;
}
  • Like 1
Δημοσ.

Μια παρατήρηση: αν δεν μας πεις ακριβώς τι πρόβλημα έχεις, δεν πρόκειται να λάβεις ικανοποιητική απάντηση, και στο τέλος θα εκνευρίσεις κόσμο που προσπαθεί να σε βοηθήσει σε λάθος ερωτήματα.

 

Στο πρώτο μήνυμα δίνεις έναν κώδικα που, με μια πρώτη ματιά φαίνεται σωστός, αλλά γράφεις «δεν δουλεύει». Εγώ καταλαβαίνω (όπως και άλλοι) «δεν τρέχει καθόλου / δεν μεταγλωττίζεται».

 

Μετά από μερικά μηνύματα γράφεις «δεν βγάζει σφάλματα, αλλά δεν δουλεύει όπως πρέπει». Πάλι δηλαδή δεν μας λες τι δεν σου δουλεύει σωστά!

 

Στο τέλος μας δίνεις ολόκληρο έναν κώδικα που δεν χρησιμοποιεί αυτό που θέλεις να χρησιμοποιήσεις. Εμείς τι πρέπει να κάνουμε με αυτό;

 

Στο ενδιάμεσο παρατηρείς ότι, καθώς τα ερωτήματά σου δεν ήταν ποτέ ξεκάθαρα, σου έχουν δοθεί άσχετες απαντήσεις, σε ό,τι νόμιζε και με όποιες υποθέσεις νόμιζε ο καθένας που διάβαζε το θέμα...

 

Αυτά!

 

ΥΓ. Γράφεις κάπου:

 

 

Τονιζω το να δειχνει, οχι να ισουται, διοτι αυτο λεει η ασκηση και απο οτι καταλαβαινω εφοσον θελει να δειχνει, θα μπορουμε μεσω του πινακα να εχουμε προσβαση σε ολοκληρη την λιστα.

Αυτό είναι το σημείο που, δυστυχώς :-), μαθαίνεις ότι στην Java τα πάντα (εκτός από τις μεταβλητές απλώς τύπων, π.χ. int, double κ.λπ.) είναι δείκτες -- αλλά δεν μας το λένε για να μην τρομάξουμε. Γι' αυτό και τις «μεταβλητές» αντικειμένων είναι καλύτερο να τις λέμε «αναφορές», για να το θυμόμαστε. Έτσι αν έχεις π.χ.

class Node {...}

Node a = new Node();
Node b = a;

έχεις φτιάξει ένα αντικείμενο με τη new και έχεις δύο αναφορές σε αυτό, τις a και b. Μεταξύ αντικειμένων, το = σημαίνει πάντα «βάλε την αναφορά να δείχνει σε...»

  • Like 2
Δημοσ.

Aztec σε ευχαριστω.

 

nplatis εχεις δικιο απλως ειμαι και εγω μπερδεμενος με το ολο concept καπως. Θα δοκιμασω αυτο που εγραψε ο Aztec και αν δεν βγαλω ακρη θα επανελθω.

Δημοσ.

Όχι! Πρέπει να δοκιμάσεις τον κώδικά σου πιο προσεκτικά!

 

 

Είσαι σίγουρος ότι η λίστα σου δουλεύει σωστά από μόνη της; Αν όχι, πρέπει να την δοκιμάσεις προσεκτικά, για να δεις τι δεν κάνει σωστά.

 

Μόλις είσαι σίγουρος ότι δουλεύει σωστά, φτιάξε πίνακα και δοκίμασε τις πολλές λίστες που χρειάζεσαι.

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...