Lanike71 Δημοσ. 4 Οκτωβρίου 2016 Δημοσ. 4 Οκτωβρίου 2016 Έστω το εξής παράδειγμα: for(int i=0; i<mylist.size(); i++) { do something if(something==true) mylist.remove(ena stoixeio) } Έχει επιπτώσεις αυτό στην αρχική for ; Αν ναι υπάρχει κάποια έξυπνη λύση;
kaliakman Δημοσ. 4 Οκτωβρίου 2016 Δημοσ. 4 Οκτωβρίου 2016 Δεν καταλαβαίνω τι θέλεις να πεις αλλά μπορείς να κάνεις και το πιο "καινουριο" for άμα θέλεις ανάθεση που θεωρείται πιο ασφαλές : for(int element: myList){ ... }
Lanike71 Δημοσ. 4 Οκτωβρίου 2016 Μέλος Δημοσ. 4 Οκτωβρίου 2016 Αν δεν έγινε κατανοητό: Το μέγεθος της mylist αλλάζει μέσα στη for, οπότε έχεις θέμα όταν λες i < mylist.size(). Αλλά νομίζω βρήκα κάτι σχετικό: http://stackoverflow.com/questions/10738634/delete-data-from-arraylist-with-a-for-loop 1
NickSym Δημοσ. 5 Οκτωβρίου 2016 Δημοσ. 5 Οκτωβρίου 2016 Θεωρώ ότι το μόνο πρόβλημα που μπορεί να προκύψει δεδομένου ότι η εντολή i<mylist.size() αναθεωρείται με την νέα τιμή του mylist.size() είναι να προσπεράσεις στοιχεία δίχως να τα ελέγξεις. Δηλαδή αν διαγράψεις ένα στοιχείο, ο μετρητής σου θα αυξηθεί αλλά η θέση του επόμενου στοιχείου θα είναι αυτή που βρίσκονταν το πλέον διαγραμμένο στοιχείο -μια θέση πίσω-. Μπορείς φυσικά να το κάνεις trace με ένα τυχαίο παράδειγμα...
defacer Δημοσ. 5 Οκτωβρίου 2016 Δημοσ. 5 Οκτωβρίου 2016 Έχει επιπτώσεις αυτό στην αρχική for ; Αν ναι υπάρχει κάποια έξυπνη λύση; Όπως λέει και η λύση που βρήκες, τα πράγματα είναι απλούστερα αν ο κώδικας εκφράζει πιό φυσικά αυτό που σκοπεύεις να κάνεις. Στην προκειμένη εφόσον δε χρησιμοποιείς πουθενά το index είναι φυσικότερο να το κάνεις με iterator οπότε βγάζεις από την εξίσωση αυτό που βασικά είναι "άχρηστο implementation detail" και όχι πολύ τυχαία και το πρόβλημα μαζί.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα