Wise_One Δημοσ. 5 Μαΐου 2008 Δημοσ. 5 Μαΐου 2008 Την καλησπέρα μου. Το παρακάτω ήταν θέμα της εξέτασης που είχαμε πριν 2 ώρες και με μπέρδεψε καθώς δεν είχα ξανακάνει τέτοιου είδους μετατροπή. Εξηγώ λίγο την κατάσταση και θα δώσω και κώδικα. Έχουμε στη σχολή μάθημα Δομές Δεδομένων (σε Java). Στο πλαίσιο του μαθήματος, κάνουμε τις δικές μας δομές δεδομένων (stack, queue κλπ) και δε χρησιμοποιούμε αυτές του API της Java. Τις υλοποιούμε με πίνακα αλλά δε νομίζω ότι παίζει ρόλο στη συγκεκριμένη περίπτωση. Ο κώδικας της ουράς με πίνακα είναι ο εξής: > import java.util.Arrays; public class ArrayQueue implements Queue{ private Object[] table; private int first, last; private static final int CAPACITY = 100; public ArrayQueue(){ this(CAPACITY); } public ArrayQueue(int capacity){ table = new Object[capacity]; first = last = 0; } public void enqueue(Object element) throws StructureFullException{ if(isFull()){ throw new StructureFullException("The queue is full..."); } if(last == table.length){ alignment(); } table[last++] = element; } public Object dequeue() throws StructureEmptyException{ if(isEmpty()){ throw new StructureEmptyException("The queue is empty..."); } return table[first++]; } public Object front() throws StructureEmptyException{ if(isEmpty()){ throw new StructureEmptyException("The queue is empty..."); } return table[first]; } public int size(){ return last - first; } public boolean isEmpty(){ return size() == 0; } public boolean isFull(){ return size() == table.length; } public boolean contains(Object element){ for(int i = first; i < last; i++){ if(table[i].equals(element)){ return true; } } return false; } public void clear(){ first = last = 0; } public boolean equals(DataStructure givenStructure){ if(givenStructure.getClass()!=ArrayQueue.class){ return false; } Object[] givenArray = givenStructure.toArray(); Object[] thisArray = toArray(); return Arrays.equals(thisArray, givenArray); } public Object[] toArray(){ Object[] array = new Object[size()]; for(int i = 0; i < size(); i++){ array[i] = table[first + i]; } return array; } public void removeAll(DataStructure otherStructure){ Object[] array = otherStructure.toArray(); for (int i=0;i<array.length;i++) { for (int j=first;j<last;j++) if (table[j].equals(array[i])) { for(int k=j;k<last-1;k++) table[k] = table[k+1]; last--; } } } public boolean addAll(DataStructure otherStructure){ int freeSpace = table.length - size() - otherStructure.size(); if (freeSpace>=0) { Object[] array = otherStructure.toArray(); for(int i=0;i<array.length;i++) enqueue(array[i]); return true; } else return false; } public boolean containsAll(DataStructure otherStructure){ Object[] array = otherStructure.toArray(); for (int i=0;i<array.length;i++) if ( !contains(array[i]) ) return false; return true; } private void alignment(){ for(int i=first;i<last;i++) table[i-first] = table[i]; // shift all pin[i] objects last -= first; // recalculate last value first = 0; // recalculate first value } } Μας ζητήθηκε λοιπόν στην εξέταση να φτιάξουμε μέθοδο, η οποία επιστρέφει το δεύτερο στοιχείο μιας ουράς απ' την αρχή της. Η δήλωση της μεθόδου: >public static int second(ArrayQueue q) Δεν επιτρεπόταν να χρησιμοποιήσουμε πίνακα στην υλοποίηση της μεθόδου, όπως επίσης και οποιαδήποτε μέθοδο που επιστρέφει πίνακα (όπως η toArray()). Επιτρεπόταν να χρησιμοποιήσουμε όποια άλλη δομή δεδομένων θέλαμε (stack, queue, linked list). Επίσης, πρέπει η αρχική ουρά να μείνει ανέπαφη. Το πρόβλημα είναι το εξής: αν προσέξατε τον κώδικα της ArrayQueue, βάζουμε στα ορίσματα Object ούτως ώστε να περνάνε ό,τι τύπου δεδομένα θέλουμε. Η μέθοδος second() όμως, επιστρέφει int! Πρέπει επομένως να πάρουμε το Object και να το κάνουμε int! Στη συγκεκριμένη άσκηση, βάλαμε ακέραιους μέσω δημιουργού τυχαίων αριθμών. Εγώ έκανα το εξής: Random rnd = new Random() κι όπου χρειαζόμουν αριθμό: rnd.nextInt() Οπότε συνεχίζουμε να έχουμε Objects. Καλώντας την front() παίρνω το δεύτερο στοιχείο (μες στο loop) σε μια μεταβλητή. Πώς το επιστρέφω όμως int; Ο κώδικας που έγραψα και παρέδωσα είναι ο εξής: > public static int second(ArrayQueue q){ //This method enqueues/dequeues all of q.elements //When at second dequeue, the value is stored in a variable //This variable is finally returned Object store; for(int i = 0; i < q.size(); i++){ if(i == 1){ store = q.front(); } q.enqueue(q.dequeue()); } //Here - somehow - I convert the Object to an int in order //to return it return store; } Δοκίμασε με απλό casting (int store; store = (int)q.front() ), δοκίμασα και με Integer.parseInt(store) αλλά δε δούλεψε τίποτα. Αν έχετε απάντηση θα ήθελα να την ακούσω γιατί είμαι πολύ περίεργος να δώ πώς λύνεται αυτό! (έπιανε και το 90% της εξέτασης )
alex2005 Δημοσ. 5 Μαΐου 2008 Δημοσ. 5 Μαΐου 2008 Δεν μπορείς να κάνεις cast ένα Object σε int. Μπορείς όμως να κάνεις cast ένα Object σε Integer και μετά να πάρεις το int από μέσα. Υποθέτω πως μάλλον αυτό ήθελε ο καθηγητής σας με αυτήν την ηλίθια άσκηση.
Wise_One Δημοσ. 5 Μαΐου 2008 Μέλος Δημοσ. 5 Μαΐου 2008 Έχεις δίκιο. Το να δηλώσω το store ως int και να κάνω casting σε Integer δούλεψε. Σ' ευχαριστώ πολύ. Τώρα για τα θέματα... την άλλη ομάδα λυπάμαι (ήμασταν Α & Β) που απ' όσο άκουγα, τα βρήκε πολύυυ σκούρα.
alex2005 Δημοσ. 5 Μαΐου 2008 Δημοσ. 5 Μαΐου 2008 Καλά ρε παιδιά μην τρελαίνεστε αυτά δεν είναι δύσκολα θέματα....τι πιο χαζό πια να σας βάλει?Να κάνετε πρόσθεση δύο αριθμών?? Αν δείτε θέματα που βάζουν σε πανεπιστήμια....πχ Αγγλία θα τραβάτε τα βυζιά σας αν αυτά θεωρείτε δύσκολα. Μην ξεχνάτε ότι από ένα ίδρυμα πρέπει να βγείτε επιστήμονες τις πληροφορικής,και να μπορείτε να εργαστείτε σε ρεαλιστικά έργα. Κατά την άποψή μου η μάθηση στα περισσότερα ιδρύματα είναι παιδικού επιπέδου....αλλά τέλος πάντων μεγάλη συζήτηση είναι αυτή
Wise_One Δημοσ. 6 Μαΐου 2008 Μέλος Δημοσ. 6 Μαΐου 2008 Αυτό φίλε μου το πιστεύω κι εγώ. Απλά ξέρεις τί γίνεται; Οι περισσότεροι διαβάζουν για να περάσουν τον μάθημα (το κάθε μάθημα). Δε το κάνουν για να ΜΑΘΟΥΝ, αλλά για να πάρουν το βαθμό. Και μετά μια κοπελιά στην υπέρβαση της toString(), δεν καταλάβαινε γιατί ο καθηγητής έγραφε String s = "mpla mpla mpla" ενώ μας νωρίτερα στα εξάμηνα μας έδειξαν String s = new String().
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.