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

Java : Array & Collection<T>


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

Δημοσ.

Γράφοντας κάτι σε Java έφτασα πάνω στα εξής στοιχεία που μου προκαλούν ένα περίπου πρόβλημα.

 

Δεν μπορείς να φτιάξεις (Σε μια template συνάρτηση) πίνακα του template τύπου.

 

και

 

Πίνακς και Collection<T> είναι διαφορετικά πράγματα οπότε δε μπορείς να έχεις έναν γενικό τύπο που να περιγραφεί κάθε ( πως να το πω; ) πολλαπλότητα όπως π.χ. το IEnumerable στο .net.

 

Πάμε στο θέμα τώρα. Φτιάχνω μια template συνάρτηση in που δέχεται ένα αντικείμενο και ένα πίνακα (της μορφής T... items, variable number of arguments) καθώς και ένα interface για το πως να εξετάζεται η ισότητα μεταξύ των δύο ίδιων αντικειμένων.

 

Έχουμε

>
public interface Equality<T>  { public boolean isEqual(T r, T l);  }

public static<T> boolean isIn(T item, Equality<T> eq, T... items)
{
   boolean ret = false;
   for(T t : items)
   {
       if(eq.isEqual(item, t))
       {
           ret = true;
           break;
       }
   }
   return ret;
}

 

Ωραία. Τώρα θέλω να κάνω το ίδιο και για Collection<T>. Και πρέπει να ξαναγράψω ακριβώς τον ίδιο κώδικα αλλάζοντας την τελευταία παράμετρο της υπογραφής.

 

Υπάρχει καμιά πιο έξυπνη λύση ώστε να μπορέσω απο το ένα isIn να χρησιμοποιήσω το άλλο;

 

Αν γινότανε να φτιάξεις πίνακα από template θα λυνόταν εύκολα ως εξής.

>
public static<T> boolean isIn(T item, Equality<T> eq, Collection<T> items)
{
   return isIn(item, eq, items.toArray( new T[ items.size() ] ) );
}

 

Επίσης γίνεται το αντίθετο. Να φτιάξω την συνάρτηση για Collection και η συνάρτηση με τον πίνακα να φτιάχνει ένα Collection απο τον πίνακα και την καλεί. Αλλά δε μου "κάθεται" πολύ καλά αυτό.

Δημοσ.

Τελικά ψάχνοντας στον ίδιο τον κώδικα του jdk βρήκα μια λύση.

 

>
   @SuppressWarnings("unchecked")
   public static<T extends Object> boolean isIn(T item, Equality<T> eq, Collection<T> items)
   {
       return isIn(item, eq, items.toArray( 
               (T[]) Array.newInstance( ((Object)item).getClass(), items.size()) )
               );
   }

 

Την ίδια τεχνική με το Array.newInstance και cast χρησιμοποιούν στο jdk εσωτερικά στο Arrays.copyOf()

 

 

Ωστόσο αν υπάρχει κάποια πρόταση ή ιδέα, είναι ευπρόσδεκτη.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...