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

Java Issue - Θα σκίσω τα πτυχίο


Snolly

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

Δημοσ.

>    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.

 

ΓΙΑΤΙ;;;;

Δημοσ.

Χωρις να το εξετασω ιδιατερα (και εχω χρονια να ασχοληθω με java) αλλα απ'οτι θυμαμαι, τα παντα στη Java πλην των πολυ βασικων data types λειτουργουν με references, δηλαδη σαν pointers

Οποτε εφοσον δηλωνεις

Solution newSolution = oldSolution;

 

To new και το oldsolution ουσιαστικα αναφερονται στο ιδιο αντικειμενο. To oldsolution που πηρες με παραμετρο δεν το πηρες by value αλλα by reference

Επισκέπτης
Δημοσ.

η απάντησή σου βρίσκεται εδώ...

Solution newSolution = oldSolution;

 

είναι reference απο τη στιγμή που δεν κάνεις allocate διαφορετικό τμήμα μνήμης για το newSolution...

 

σκίστο τώρα!

 

edit:γαμώτο, slow typer...

Δημοσ.

Solution newSolution = Object.Clone(oldSolution);

 

αν δεν δουλέψει πρέπει να κάνεις override τον constructor "=" για να ορίσεις εσύ το copy.

Δημοσ.
Χωρις να το εξετασω ιδιατερα (και εχω χρονια να ασχοληθω με java) αλλα απ'οτι θυμαμαι, τα παντα στη Java πλην των πολυ βασικων data types λειτουργουν με references, δηλαδη σαν pointers

Οποτε εφοσον δηλωνεις

Solution newSolution = oldSolution;

 

To new και το oldsolution ουσιαστικα αναφερονται στο ιδιο αντικειμενο. To oldsolution που πηρες με παραμετρο δεν το πηρες by value αλλα by reference

 

Well said! :)

Δημοσ.

Λοιπόν οκ έμεινα μαλάκας.

 

Σε vector objects δε συμβαίνει αυτό.

 

Τα solutions κανουν extend το HashMap και όντως το = κάνει by reference pass.

 

Το ίδιο το HashMap κανει implement το Cloneable αλλά δε δουλεύει από μόνο του μάλλον πρέπει να ξαναγράψω την clone() και να κάνω deep cloning.

 

Θα το δοκιμάσω και θα σας πω.

 

Ευχαριστώ.

Δημοσ.
Λοιπόν οκ έμεινα μαλάκας.

Τα 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]

Δημοσ.

Λοιπον έγραψα την .clone() και έκανα deep cloning και έπαιξε έτσι:

 

>Solution newSolution = (Solution)oldSolution.clone();

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...