Snolly Δημοσ. 1 Ιουνίου 2010 Δημοσ. 1 Ιουνίου 2010 > private Solution genNeighborSolution(Solution oldSolution, Vector<Source> sources) { Solution newSolution = oldSolution; for (Source src : sources) { Concentrator oldConc = null; for (Concentrator conc : oldSolution.keySet()) { if (oldSolution.get(conc).containsKey(src)) { oldConc = conc; } } if (oldConc != null) { for (Concentrator newConc : newSolution.keySet()) { if (!newConc.equals(oldConc) && newSolution.getAvailableCapacity(newConc) >= src.getLoad() && newSolution.getAvailablePorts(newConc) >= 1) { newSolution.get(newConc).put(src, networkMap.get(newConc).get(src)); newSolution.get(oldConc).remove(src); System.out.println("Moved " + src.getId() + " from " + oldConc.getId() + " with cost " + networkMap.get(oldConc).get(src) + " to " + newConc.getId() + " with cost " + networkMap.get(newConc).get(src)); } } } } //temperature = 0; return newSolution; } Σε αυτή τη μέθοδο ενώ δεν ακουμπάω το HashMap oldSolution και αφού πειράξω το newSolution και ΜΟΝΟ ΑΥΤΟ αφού εκτελεστεί ο κώδικας έχει τροποποιηθεί και το oldSolution. ΓΙΑΤΙ;;;;
Bspus Δημοσ. 1 Ιουνίου 2010 Δημοσ. 1 Ιουνίου 2010 Χωρις να το εξετασω ιδιατερα (και εχω χρονια να ασχοληθω με java) αλλα απ'οτι θυμαμαι, τα παντα στη Java πλην των πολυ βασικων data types λειτουργουν με references, δηλαδη σαν pointers Οποτε εφοσον δηλωνεις Solution newSolution = oldSolution; To new και το oldsolution ουσιαστικα αναφερονται στο ιδιο αντικειμενο. To oldsolution που πηρες με παραμετρο δεν το πηρες by value αλλα by reference
Επισκέπτης Δημοσ. 1 Ιουνίου 2010 Δημοσ. 1 Ιουνίου 2010 η απάντησή σου βρίσκεται εδώ... Solution newSolution = oldSolution; είναι reference απο τη στιγμή που δεν κάνεις allocate διαφορετικό τμήμα μνήμης για το newSolution... σκίστο τώρα! edit:γαμώτο, slow typer...
ee3509 Δημοσ. 1 Ιουνίου 2010 Δημοσ. 1 Ιουνίου 2010 Solution newSolution = Object.Clone(oldSolution); αν δεν δουλέψει πρέπει να κάνεις override τον constructor "=" για να ορίσεις εσύ το copy.
RapidShade Δημοσ. 1 Ιουνίου 2010 Δημοσ. 1 Ιουνίου 2010 Χωρις να το εξετασω ιδιατερα (και εχω χρονια να ασχοληθω με java) αλλα απ'οτι θυμαμαι, τα παντα στη Java πλην των πολυ βασικων data types λειτουργουν με references, δηλαδη σαν pointersΟποτε εφοσον δηλωνεις Solution newSolution = oldSolution; To new και το oldsolution ουσιαστικα αναφερονται στο ιδιο αντικειμενο. To oldsolution που πηρες με παραμετρο δεν το πηρες by value αλλα by reference Well said!
Snolly Δημοσ. 1 Ιουνίου 2010 Μέλος Δημοσ. 1 Ιουνίου 2010 Λοιπόν οκ έμεινα μαλάκας. Σε vector objects δε συμβαίνει αυτό. Τα solutions κανουν extend το HashMap και όντως το = κάνει by reference pass. Το ίδιο το HashMap κανει implement το Cloneable αλλά δε δουλεύει από μόνο του μάλλον πρέπει να ξαναγράψω την clone() και να κάνω deep cloning. Θα το δοκιμάσω και θα σας πω. Ευχαριστώ.
Snolly Δημοσ. 1 Ιουνίου 2010 Μέλος Δημοσ. 1 Ιουνίου 2010 το πτυχίο το έσκισες; :-p δε το εχω ευκαιρο εδω γυρω το πουστικο.
Cue Δημοσ. 2 Ιουνίου 2010 Δημοσ. 2 Ιουνίου 2010 Λοιπόν οκ έμεινα μαλάκας.Τα solutions κανουν extend το HashMap και όντως το = κάνει by reference pass. Αν ισχύει απλά είσαι καλυμένος με το παρακάτω > public class Solution<K, V> extends HashMap<K, V> { public Solution(Solution<K, V> solution) { super(solution); } } οπότε μετά απλά λες > Solution newSolution = new Solution( oldSolution ); Σε vector objects δε συμβαίνει αυτό. Η αλήθεια ότι η Java εκ φύσεως κάνει parameter passing by value και όχι by reference. Πρόσεξε ότι αλλαγές κάνεις σε αυτό που σου επιστρέφει η get. Δηλαδή στον Concentrator όπου και τα 2 solutions (old και new) έχουν τα ίδια references. Άρα το να δημιουργήσεις ένα new Solution δε σε βοηθάει και πολύ. > newSolution.get(newConc).[b]put(src, networkMap.get(newConc).get(src));[/b] newSolution.get(oldConc).[b]remove(src);[/b]
Snolly Δημοσ. 2 Ιουνίου 2010 Μέλος Δημοσ. 2 Ιουνίου 2010 Λοιπον έγραψα την .clone() και έκανα deep cloning και έπαιξε έτσι: >Solution newSolution = (Solution)oldSolution.clone();
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.