THMMY.gr

Ηλεκτρονικοί Υπολογιστές και Τεχνικά Θέματα => Java => Topic started by: ^^DaRk_HunTeR on March 01, 2013, 19:11:06 pm



Title: Java - Vectors
Post by: ^^DaRk_HunTeR on March 01, 2013, 19:11:06 pm
Παίζει να ναι κάτι πολύ απλό αλλά τώρα έχω κολλήσει…

Code:
LineClass LineObject;

 Vector <LineClass> LineVector=new Vector <LineClass> (counter/4);
 //for Testing purposes
 System.out.println("Initial size: " + LineVector.size());
         System.out.println("Initial capacity: " + LineVector.capacity());
     
 for(int j=0;j<counter;j+=4){
           LineObject=new LineClass();
           LineObject.setAkro1( New_arrayline[j],  New_arrayline[j+1]);
           LineObject.setAkro2( New_arrayline[j+2],  New_arrayline[j+3]);
           LineVector.addElement(LineObject);
 }          
 
 
 //System.out.println("First element: " +LineVector.firstElement()); //den doulepse:P      
 System.out.println("Capacity after all additions: " + LineVector.capacity());  
         
// For each element in the vector, print out the index, the
       // class of the element, and the element itself
       for (int i = 0; i < LineVector.size(); i++) {
           Object element = LineVector.elementAt(i);
           System.out.println("   " + i + " (" +element.getClass().getName() + "): " +element);
       }
       System.out.println();


Λοιπόν έχω διάφορους πίνακες τους οποίους θέλω για διάφορους λόγους να μετατρέψω σε Vectors.
Γράφω λοιπόν τον κώδικα(που μου φαίνεται σωστός) για να κάνω τη μετατροπή αλλά μετά όμως θέλω να διαπιστώσω αν τα δεδομένα(εν προκειμένω integers, συντεταγμένες κάποιων γραμμών)  του πρώτου πίνακα(New_arrayline[]) έχουν περάσει σωστά ως elements του πρώτου vector(LineVector). Για αυτό θέλω να εμφανίζω αυτά τα elements… και προς το παρόν το μόνο που παίρνω είναι:

Quote
Initial size: 0
Initial capacity: 25
Capacity after all additions: 25
   0 (ClassesGeneral.LineClass): ClassesGeneral.LineClass@6659fb21
   1 (ClassesGeneral.LineClass): ClassesGeneral.LineClass@1d766806
   2 (ClassesGeneral.LineClass): ClassesGeneral.LineClass@48a77106
   3 (ClassesGeneral.LineClass): ClassesGeneral.LineClass@68ed662d
...

Που γίνεται το Fail?

Κάπου διάβασα ότι πρέπει να κάνω τη δική μου toString() για να εκτυπωθούν σωστά τα elements αλλά δεν κατάλαβα ακριβώς γιατί και πως...

Για πείτε γνώμες...


P.S.: Απαντήσεις του στυλ βάλε arraylists είναι πιο γαμάτες θα αγνοούνται:P


Title: Re: Java - Vectors
Post by: DoomGuard on March 01, 2013, 19:20:29 pm
Αν δεν υλοποιήσεις την δικιά σου toString() για να μετατρέψεις σε εκτυπώσιμη μορφή το αντικείμενο, χρησιμοποιείται η Object.toStrint() που εκτυπώνει όνομα κλάσης και θέση μνήμης νομίζω.

Για να δουλέψει το παραπάνω πρέπει να αλλάξεις το
Code:
Object element = LineVector.elementAt(i);
σε
Code:
LineClass element = LineVector.elementAt(i);


Title: Re: Java - Vectors
Post by: ^^DaRk_HunTeR on March 01, 2013, 19:25:23 pm
Αν δεν υλοποιήσεις την δικιά σου toString() για να μετατρέψεις σε εκτυπώσιμη μορφή το αντικείμενο, χρησιμοποιείται η Object.toStrint() που εκτυπώνει όνομα κλάσης και θέση μνήμης νομίζω.
και στην Object.toString τι θα δωσω?
 
Quote

Για να δουλεψει το παραπάνω πρέπει να αλλάξεις το
Code:
Object element = LineVector.elementAt(i);
σε
Code:
LineClass element = LineVector.elementAt(i);
Ναι αυτό φαίνεται σωστό(ήταν απροσεξία) απλά δεν άλλαξε κάτι στο αποτέλεσμα...


Αυτό που θέλω είναι να γίνονται print οι integers μέσα στα elements...


Title: Re: Java - Vectors
Post by: antares on March 01, 2013, 19:26:40 pm
Ναι στην κλάσση LineClass πρέπει να κάνεις override την μέθοδο toString(). Π.χ.


public class LineClass {

  @Override
  public String toString() {
     return "Edw ektypwneis to object sou me vash ta members";
  }

}


Title: Re: Java - Vectors
Post by: ^^DaRk_HunTeR on March 01, 2013, 19:44:08 pm
Αυτό είναι το σώμα της κλάσης...
Code:
public class LineClass {

   private int akro1x;
   private int akro1y;
   private int akro2x;
   private int akro2y;
   private String linestring;

   public LineClass(){}
   public void setAkro1(int x1, int y1){
      akro1x=x1;
      akro1y=y1;
   }
   public void setAkro2(int x2, int y2){
      akro2x=x2;
      akro2y=y2;
   }
   public void setLineString(String s){  linestring=s;  }

   public int getAkro1x(){  return akro1x; }
   public int getAkro1y(){  return akro1y; }
   public int getAkro2x(){ return akro2x; }
   public int getAkro2y(){ return akro2y; }
   public String getLineString(){  return linestring;  }

    public String toString() {
//return akro1x;
     return this.getClass().getName();
}


}

Με τις τελευταίες γραμμές κώδiκα στο printing έφυγε το "@... " αλλά πάλι δε βλέπω integers...


----- Εδιτ ----- 

'Ακυρο νομίζω το βρήκα, δε χρειαζόταν τπτ απο όλα αυτα...


Title: Re: Java - Vectors
Post by: DoomGuard on March 01, 2013, 20:09:46 pm
Code:
    public String toString() {
    return Integer(this.akro1x).toString() +","+ Integer(this.akro1y).toString()+":"+Integer(this.akro2x).toString()+","+Integer(this.akro2y).toString();
    }


Title: Re: Java - Vectors
Post by: ^^DaRk_HunTeR on March 02, 2013, 05:24:33 am
@Doomguard
Αυτό που έγραψες ήταν λάθος γιατί το typecasting δε χρειάζεται(είναι ούτως ή άλλως integer), ούτε το .toString(), σε αυτό το σημείο, χρειάζεται και δε δουλεύει εν προκειμένω... (πετάει error)

Βρήκα δύο λύσεις δεν ξέρω αν κάποια είναι πιο σωστή απο την άλλη...

Η πρώτη είναι η υλοποίηση της toString() στην LineClass
Code:
 public String toString() {
  return "Akro1 = ("+akro1x +","+akro1y+"): Akro2 = ("+akro2x+","+akro2y+")";
    
   }

Και μετά η εμφάνιση αυτής στη main:
Code:
for(int i=0;i<LineVector.size();i++)
     System.out.println(LineVector.get(i).toString());        
       

Η δεύτερη είναι η τροποίηση του printing που έριξα παραπάνω ως εξής(χωρίς δλδ toString()):
Code:
// For each element in the vector, print out the index, the
// class of the element, and the element itself
for (int i = 0; i < LineVector.size(); i++) {
         LineClass element = LineVector.elementAt(i);
                //System.out.println("   " + i + " (" +element.getClass().getName() + "): " +element.getAkro1x());
           System.out.println(" Akro1["+i+"]:  ("+element.getAkro1x()+","+element.getAkro1y()+")");
         System.out.println(" Akro2["+i+"]:  ("+element.getAkro2x()+","+element.getAkro2y()+")");
}
System.out.println();


Εμένα μου φαίνονται και τα δύο σωστά...
Το σίγουρο είναι ότι βγάζουν τα ίδια(αναμενόμενα) αποτελέσματα...


Title: Re: Java - Vectors
Post by: Issle on March 04, 2013, 00:13:44 am
Η δεύτερη λύση είναι καλύτερη. Συναρτήσεις βασικών αντικειμένων στην java όπως αυτές του Object/Thread κτλ καλό είναι να μην γίνονται Override γιατί έχουν προκαθορισμένη σημασία. Αν ένας προγραμματιστής πάρει τον κώδικά σου και χρησιμοποιήσει την toString() για key πχ σε ένα Map<> και υποθέσει οτι επιστρέφει το @-Representation του αντικειμένου χωρίς να ξέρει οτι εσύ έκανες Override μπορεί να υποπέσει σε τρελά bugs μετά. Οπότε ότι κάνεις print καλύτερα να γίνεται σε διαφορετική method.