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

[Λύθηκε] Δημιουργία «υβριδικού» πίνακα στη Java


Evangeli

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

Δημοσ.

Γνωρίζει κανείς αν μπορούμε να δημιουργήσουμε στην Java πίνακα με δυο στήλες εκ των οποίων η πρώτη θα περιέχει χαρακτήρες ενώ η δεύτερη ακεραίους?

 

Βαγγέλης.

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

Βαγγέλης ή Evangeli ρε φίλος;;;

όπως και να έχει, μάλλον θες Hashtable

Δημοσ.

Η απλή απάντηση είναι ότι δεν μπορείς.

Ο πίνακας (array) πρέπει να έχει ιδίου τύπου* αντικείμενα.

 

*Hint: extends/implements

Δημοσ.

μάλλον ψάχνεις αυτό

 

>
public class ArrayExample {
private Object[][] myArray;
public ArrayExample(){

myArray=new Object[5][2];
for (int i=0;i<5;i++){
myArray[i][0]=new String("");
myArray[i][1]=new Integer(0);
}
myArray[1][0]="fdgfdgdfg";
myArray[1][1]=10;
System.out.println("\n my array value for row 1="+myArray[1][0]+","+myArray[1][1]);
System.out.println("\n praxeis(myArray[1][1]*2)="+((Integer)myArray[1][1]).intValue()*2);
}

public static void main(String[] args) {
      new ArrayExample();
   }
}

Δημοσ.

Αλλιώς το υλοποιείς ,αντι για 2D Πινακα (που στην ουσία είναι πίνακας που έχει ως στοιχεία πίνακα) με ArrayList που έχει ως στοιχεία ArrayList.

Δημοσ.
μάλλον ψάχνεις αυτό

 

>
public class ArrayExample {
private Object[][] myArray;
public ArrayExample(){

myArray=new Object[5][2];
for (int i=0;i<5;i++){
myArray[i][0]=new String("");
myArray[i][1]=new Integer(0);
}
myArray[1][0]="fdgfdgdfg";
myArray[1][1]=10;
System.out.println("\n my array value for row 1="+myArray[1][0]+","+myArray[1][1]);
System.out.println("\n praxeis(myArray[1][1]*2)="+((Integer)myArray[1][1]).intValue()*2);
}

public static void main(String[] args) {
      new ArrayExample();
   }
}

 

 

Αυτή η λύση μου αρέσει αλλα παρατηρώ οτι δεν μπορούμε να κάνουμε πράξεις με τα στοιχεία του πίνακα! π.χ. το myArray[0][1]++ δεν επιτρέπεται! Τι μπορώ να κάνω?

Δημοσ.

cast :-)

 

Προσοχή: Από 1.1.2008, μηνύματα γραμμένα σε greeklish θα διαγράφονται. Παρακαλούμε χρησιμοποιήστε ελληνικούς χαρακτήρες στα μηνύματα σας.

 

Δημοσ.

Αυτή η λύση μου αρέσει αλλα παρατηρώ οτι δεν μπορούμε να κάνουμε πράξεις με τα στοιχεία του πίνακα! π.χ. το myArray[0][1]++ δεν επιτρέπεται! Τι μπορώ να κάνω?

 

>
myArray[1][1]=((Integer)myArray[1][1]).intValue()+1;//myArray[1][1]++;

 

το είχα και στον αρχικό κώδικα αλλά μάλλον δεν το πρόσεξες

>
System.out.println("\n praxeis(myArray[1][1]*2)="+((Integer)myArray[1][1]).intValue()*2);//myArray[1][1]*2;
}

Δημοσ.

Δεν θα χρησιμοποιούσα τον παραπάνω τρόπο για τους εξής λόγους.

 

Δεν είναι type safe. Είναι πολύ εύκολο να βάλεις ένα οποιοδήποτε αντικείμενο στο συγκεκριμένο array με αποτέλεσμα να μην γνωρίζεις τλκ τι αντικείμενα έχεις.

 

Χρειάζεται cast κάθε φορά που πρέπει να χρησιμοποιήσεις ένα αντικείμενο στο array με αποτέλεσμα ο κώδικάς σου να γίνεται ποιο φλύαρος. Το σημαντικότερο όμως είναι ότι δεν είναι typesafe τα arrays (see above) άρα και επιρρεπής σε ClassCastException.

 

Αν θες να χρησιμοποιήσεις array ντε και καλά, φτιάξε ένα Interface που να προσδιορίζει τα κοινά των αντικειμένων που θες να αποθηκεύσεις.

 

π.χ.

 

>
public interface Foo{
//methods
}

Foo[][] foos = //

 

Καλύτερα όμως να αποφεύγεις τα arrays και να χρησιμοποιείς generics

 

Αν μας έλεγες περισσότερα για το πρόβλημα που πας να λύσεις, πιθανότατα να μπορούσαμε να σου δώσουμε και μία καλύτερη λύση.

Δημοσ.
Δεν θα χρησιμοποιούσα τον παραπάνω τρόπο για τους εξής λόγους.

 

Δεν είναι type safe. Είναι πολύ εύκολο να βάλεις ένα οποιοδήποτε αντικείμενο στο συγκεκριμένο array με αποτέλεσμα να μην γνωρίζεις τλκ τι αντικείμενα έχεις.

 

Χρειάζεται cast κάθε φορά που πρέπει να χρησιμοποιήσεις ένα αντικείμενο στο array με αποτέλεσμα ο κώδικάς σου να γίνεται ποιο φλύαρος. Το σημαντικότερο όμως είναι ότι δεν είναι typesafe τα arrays (see above) άρα και επιρρεπής σε ClassCastException.

 

 

 

θα συμφωνήσω και εγώ και για να δώσω στον Evangeli να το καταλάβει

άλλαξε στον κώδικα που έστειλα το

>
myArray[1][1]="10";//αντί myArray[1][1]=10;

Δημοσ.

Παιδιά σας ευχαριστώ για τις συμβουλές σας. Τελικά χρησιμοποίησα την «μη ενδεδειγμένη» λύση καθώς μου είναι κατανοητή και δουλεύει για το πρόβλημά μου.

 

Βαγγέλης.

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

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

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