monkey90 Δημοσ. 17 Δεκεμβρίου 2011 Δημοσ. 17 Δεκεμβρίου 2011 Βλέπετε κάποιο λάθος στον παρακάτω κώδικα?Μου λέει ότι βγένει έξω από τα όρια.Χωρίς αυτον το πρόγραμμα λειτουργεί μια χαρά. if(check==true) { int size=ListWaggon.size(); for(int i=0;i<size;i++) { if(ListWaggon.get(i).isTicket()==false) { ListWaggon.remove(i); ninjas+=1; } } }
isay Δημοσ. 17 Δεκεμβρίου 2011 Δημοσ. 17 Δεκεμβρίου 2011 Βλέπετε κάποιο λάθος στον παρακάτω κώδικα?Μου λέει ότι βγένει έξω από τα όρια.Χωρίς αυτον το πρόγραμμα λειτουργεί μια χαρά. > if(check==true) { int size=ListWaggon.size(); for(int i=0;i<size;i++) { if(ListWaggon.get(i).isTicket()==false) { ListWaggon.remove(i); ninjas+=1; } } } Δοκίμασε αντι για >for(int i=0;i<size;i++) να βαλεις >for(int i=0;i<size-1;i++)
anakiou Δημοσ. 17 Δεκεμβρίου 2011 Δημοσ. 17 Δεκεμβρίου 2011 Πρέπει να πας ανάποδα: > if(check)//το check==true δεν χρειάζεται { int size=ListWaggon.size(); for(int i = size-1 ;i != -1 ; i--) { if(!ListWaggon.get(i).isTicket()) // και εδώ το == false καλύτερα με ! { ListWaggon.remove(i); ninjas+=1; } } }
monkey90 Δημοσ. 17 Δεκεμβρίου 2011 Μέλος Δημοσ. 17 Δεκεμβρίου 2011 Ευχαριστώ πολύ για τις απαντήσεις σας. anakiou με τον τρόπο που μου πρότινες λειτουργεί αλλά έτσι η for δεν γίνεται μία λιγότερη φορά αφού ξεκινάει από το size-1? Με το size δίνει τον αριθμό τον αντικειμένων που έχει ο πίνακας αλλά ο πίνακας ξέκινάει απο το 0 για αυτό γίνεται αυτό; Γενικά είναι καλύτερα να μη γράφω true και false;
anakiou Δημοσ. 17 Δεκεμβρίου 2011 Δημοσ. 17 Δεκεμβρίου 2011 Ευχαριστώ πολύ για τις απαντήσεις σας. anakiou με τον τρόπο που μου πρότινες λειτουργεί αλλά έτσι η for δεν γίνεται μία λιγότερη φορά αφού ξεκινάει από το size-1? Να θυμάσαι ότι τα Arrays είναι zero indexed που σημαίνει μια array με size 5 παίρνει index από 0 ως 4 Αρά το size-1 σε ένα Array με 5 μέλη = 4 Γενικά είναι καλύτερα να μη γράφω true και false; Απλώς κάνει το κώδικα ποιο ευανάγνωστο και είναι πλεονασμός σε μια boolean να βάζεις == true, λειτουργικά είναι το ίδιο αν και καταλαβαίνω ότι τώρα που είναι αρχή σου είναι πιο εύκολο να το κάνεις έτσι.
monkey90 Δημοσ. 17 Δεκεμβρίου 2011 Μέλος Δημοσ. 17 Δεκεμβρίου 2011 Κατάλαβα. Να είσαι καλά δε θα μπορούσα να συνεχίσω χωρίς τη βοήθεια σου. Πληροφοριακά γιατί δε λειτουργεί με for(int i=0;i<size-1;i++) ;
anakiou Δημοσ. 17 Δεκεμβρίου 2011 Δημοσ. 17 Δεκεμβρίου 2011 Πληροφοριακά γιατί δε λειτουργεί με for(int i=0;i<size-1;i++) ; > if(check==true) { int size=ListWaggon.size(); \\ Ας υποθέσουμε ότι αυτό = 5 for(int i=0;i<size-1;i++) { if(ListWaggon.get(i).isTicket()==false) \\ Αυτό είναι true { ListWaggon.remove(i); \\ Αφαιρείς 1 άρα τώρα το ListWaggon.size() = 4 και i = 1 \\και στο επόμενο loop ListWaggon.size() = 3 και i = 2 \\στο επόμενο loop ListWaggon.size() = 2 και i = 3 \\τώρα πετάει IndexOutOfBounds exception αφού προσπαθείς να \\διαβάσεις το index 3 που τώρα δεν υπάρχει } } }
tsapman Δημοσ. 17 Δεκεμβρίου 2011 Δημοσ. 17 Δεκεμβρίου 2011 Ένας ακόμα τρόπος είναι να βάλεις την κλήση του size() μέσα στο terminating condition του for: >for(int i=0; i<ListWaggon.size()-1; i++) Έτσι είσαι σίγουρος ότι δεν θα βγεις out of bounds.
anakiou Δημοσ. 17 Δεκεμβρίου 2011 Δημοσ. 17 Δεκεμβρίου 2011 Ένας ακόμα τρόπος είναι να βάλεις την κλήση του size() μέσα στο terminating condition του for: for(int i=0; i<ListWaggon.size()-1; i++) Έτσι είσαι σίγουρος ότι δεν θα βγεις out of bounds. Στη συγκεκριμένη περίπτωση όμως δεν θα διαβάσει όλα τα στοιχεία της ArrayList αφού σε κάθε iteration πιθανόν να αφαιρεί και κάποιο
GKNSB Δημοσ. 17 Δεκεμβρίου 2011 Δημοσ. 17 Δεκεμβρίου 2011 Το άλλο που θα μπορούσες να κάνεις είναι να μετατρέψεις όλη την arraylist σε πίνακα, να κάνεις τις αφαιρέσεις και μετά να το μετατρέψεις πάλι σε arraylist αλλά είναι λίγο καφρίλα
tsapman Δημοσ. 17 Δεκεμβρίου 2011 Δημοσ. 17 Δεκεμβρίου 2011 Στη συγκεκριμένη περίπτωση όμως δεν θα διαβάσει όλα τα στοιχεία της ArrayList αφού σε κάθε iteration πιθανόν να αφαιρεί και κάποιο Όντος δίκιο έχεις, θα είμαι πιο προσεκτικός.
nplatis Δημοσ. 18 Δεκεμβρίου 2011 Δημοσ. 18 Δεκεμβρίου 2011 Βλέπετε κάποιο λάθος στον παρακάτω κώδικα?Μου λέει ότι βγένει έξω από τα όρια.Χωρίς αυτον το πρόγραμμα λειτουργεί μια χαρά. if(check==true) { int size=ListWaggon.size(); for(int i=0;i<size;i++) { if(ListWaggon.get(i).isTicket()==false) { ListWaggon.remove(i); ninjas+=1; } } } Ο λόγος που δεν λειτουργεί δεν είναι το size ή size-1 αλλά ότι εσύ ορίζεις από την αρχή το πλήθος των επαναλήψεων όσο το αρχικό μέγεθος της λίστας, αλλά μετά στην πορεία πηγαίνεις και αφαιρείς στοιχεία από αυτήν. Σκέψου ότι στην αρχή η λίστα έχει π.χ. 10 στοιχεία. Εσύ με τη συνθήκη σου αφαιρείς το 4, 7, 9, οπότε η λίστα σταδιακά μένει με 9, 8, 7 στοιχεία, όμως εσύ θέλεις πάντα να κάνεις 10 επαναλήψεις. Άρα αν δεν αφήσεις σταθερό το size αλλά πηγαίνεις μέχρι ListWaggon.size() τα πράγματα θα είναι καλύτερα. Δυστυχώς υπάρχει και ένα μικρό λάθος λογικής σε αυτό τον κώδικα... Ποιο;!
παπι Δημοσ. 18 Δεκεμβρίου 2011 Δημοσ. 18 Δεκεμβρίου 2011 Δες το for each loop αλλιως πρεπει να κανεις ενα πολυπλοκο loop. Εκτος απο αυτα που λεει ο απο πανω μου, θα εχεις και ενα λογικο λαθος πχ διαγραφεις το 1, με το loop σου πας στο 2, ελα που το δυο πλεον εχει παρει τη θεση του 1 αρα ειναι και 1 αρα εσυ τσεκαρεις το 3 και οχι το 2.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα