[Java] Integer dans un Vector: utiliser valueOf() ou new ?

Integer dans un Vector: utiliser valueOf() ou new ? [Java] - Java - Programmation

Marsh Posté le 14-01-2006 à 03:50:40    

'lut
 
juste une question d'optimisation et de propreté du code (car les 2 marchent), mais entre:

Code :
  1. Vector aa;
  2. ...
  3. aa.add(new Integer("0" ));


et

Code :
  1. Vector aa;
  2. ...
  3. aa.add(Integer.valueOf("0" ));


 
qu'est-ce qui est le mieux d'après vous ?
 
d'après la javadoc:

Citation :

static Integer valueOf(String s)  
          Returns a new Integer object initialized to the value of the specified String.


 
donc je dirais que c'est strictement la même chose, mais il y a peutetre des choses que je ne maitrise pas totalement.
 
merci d'avance


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 14-01-2006 à 03:50:40   

Reply

Marsh Posté le 14-01-2006 à 04:08:50    

je te conseille ValueOf(), qui ne construit pas forcément d'objet. s'il veut, il peut réutiliser des objets dans ton dos (mais je ne coirs pas que ce soit le cas).
 
pour la classe String, c'est plus stratégique, car en utilisant String.valueOf(variable) au lieu de variable.toString(), tu es sûr de ne jamais avoir une NullPointerException si variable est null.

Reply

Marsh Posté le 14-01-2006 à 10:19:43    

ok. merci pour le conseil. je pensai en effet à une optimisation du style "pas de construction d'objet". quant à la même question appliquée à String, et bien c'est tjs bon à savoir :)


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 15-01-2006 à 09:58:30    

heu mais je viens de capter, pourquoi tu n'utilise pas
 
new Integer(0);
 
sans passer par une string ?

Reply

Marsh Posté le 15-01-2006 à 11:38:52    

Et pourquoi tu n'utilises pas l'autoboxing ?  

Code :
  1. Vector v = new Vector();
  2. v.add(0);


C'est utilisable depuis la version Tiger (5.0) de java. Donc attention si tu utilises une version antérieure.

Reply

Marsh Posté le 15-01-2006 à 12:37:00    

nraynaud a écrit :

heu mais je viens de capter, pourquoi tu n'utilise pas
 
new Integer(0);
 
sans passer par une string ?


 
le code que j'ai passé est un exemple, je me suis simplement posé cette question au moment où je parcourais les méthodes de Integer
sinon, en effet, new Integer(0) fonctionne aussi. quelle différence fais-tu avec new Integer("0" ) ? (là encore c'est une question d'optimisation, pour "comprendre" )
 
quant à l'autoboxing, sans façon. je travaille encore avec le jdk 1.3.1. je vais peutetre passer au 1.4, et encore c'est simplement parceque les regex m'intéressent...


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 15-01-2006 à 12:59:02    

Dans java il y a deux manière de représenter les entiers, une avec le type primitif int et une avec l'objet Integer.
 
L'objet Integer est en fait un int avec une envellope externe (wrapper), donc le constructeur le plus rapide est "new Integer(138)", si tu met new Integer("138" ), le systeme est obligé d'analyser la chaine de caractère "138", d'en extraire l'entier 138 pour ensuite le mettre dans l'objet Integer, pareil pour Integer.valueof, tandis que  "new Integer(138)" n'implique aucune conversion de type (138 est deja un int), il peut construire l'objet Integer directement.  
 
Si tu tapes le code de grimgroth tu verras qu'il y a des erreurs, en effet, depuis java 5.0 il faut dire au systeme si on construit un vector de string, ou un vector d'entier etc...
 
Donc moi j'écrirais plutot:
 

Code :
  1. Vector<Integer> v = new Vector<Integer>();
  2. v.add(new Integer(138));


 
PS: J'avais pas vu que t'étais encore à java 1.4, oublie cette histoire de <>.

Message cité 1 fois
Message édité par amnesiks le 15-01-2006 à 13:00:23
Reply

Marsh Posté le 15-01-2006 à 13:10:11    

amnesiks a écrit :

L'objet Integer est en fait un int avec une envellope externe (wrapper), donc le constructeur le plus rapide est "new Integer(138)", si tu met new Integer("138" ), le systeme est obligé d'analyser la chaine de caractère "138", d'en extraire l'entier 138 pour ensuite le mettre dans l'objet Integer, pareil pour Integer.valueof, tandis que  "new Integer(138)" n'implique aucune conversion de type (138 est deja un int), il peut construire l'objet Integer directement.


 
c'est bien ce que je pensais, mais je voulais etre sur. même si les 2 solutions marchent, j'ai besoin de ce genre d'optimisation, deja pour m'améliorer globalement, et puis pour améliorer mon code, car j'utilise ce genre de choses dans un algo type backpack, dont le temps de traitement est gravement exponentiel: de 1-2 secondes pour 15 entrées, à au moins 20 secondes pour une 30aine... sachant que mon programme est prévu pour tourner avec plus d'une centaine d'entrées - plus de 800 dans mon cas - ca donne une idée du temps de traitement globale :\. donc je cherche à optimiser au mieux


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 15-01-2006 à 13:15:09    

on peu voir le code ?  
par ce que je suis pas sûr que ce soit là-dessus que tu vas gagner ...

Reply

Marsh Posté le 15-01-2006 à 13:47:56    

Faut se méfier des optimisations "qui semblent logiques"...


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 15-01-2006 à 13:47:56   

Reply

Marsh Posté le 15-01-2006 à 14:03:15    

voilà... je demanderai votre indulgence si des abberrations vous sautent aux yeux, ce code est en cours de développement - mais le code est tout de même fctnnel ;):

Code :
  1. public class OptimisationTaille implements Runnable {
  2.   ...
  3.   private Hashtable tailleReps;
  4.   private Hashtable posReps;
  5.   private Hashtable cdsMp3;
  6.   private int[] meilleurCd, cd;
  7.   private long pertePlace;
  8.   int numCd;
  9.   ...
  10.   void remplissageListe() {
  11.     ...
  12.     StringBuffer str;
  13.     this.tailleReps = new Hashtable(0);
  14.     this.posReps = new Hashtable(0);
  15.     this.cdsMp3 = new Hashtable(0);
  16.     //* récupérer la liste des entrées
  17.     requete = "SELECT * FROM " + this.params.bddNomTableMp3Gst;
  18.     this.st = this.bdd.getFluxRequete();
  19.     try {
  20.       rs = st.executeQuery(requete); // exécution de la requête
  21.       while (rs.next()) { // tant que le résultat de la requête est non-vide
  22.         if (rs.getInt(3) == 0) {
  23.           this.tailleReps.put(String.valueOf(rs.getInt(1)), Integer.valueOf(rs.getString(2)));
  24.           this.posReps.put(String.valueOf(rs.getInt(1)), Integer.valueOf("0" ));
  25.         }
  26.       }
  27.     }
  28.     catch (SQLException sqle) {System.out.println("Erreur: accès bdd" );}
  29.     ...
  30.     this.cd = new int[this.tailleReps.size()];
  31.     this.meilleurCd = new int[this.tailleReps.size()];
  32.     this.numCd = 0;
  33.     do {
  34.       this.numCd++;
  35.       this.cdsMp3.put(String.valueOf(this.numCd), new Vector(0));
  36.       this.pertePlace = Long.parseLong(this.params.optTailleMedia);
  37.       this.backPack(0, Long.parseLong(this.params.optTailleMedia));
  38.       str.delete(0, str.length());
  39.       str.append("CD " ).append(this.numCd).append(":" );
  40.       for (int j=0 ; j < this.tailleReps.size() ; j++)
  41.         if ((this.meilleurCd[j] == this.numCd) && (((Integer)this.posReps.get(String.valueOf(j))).intValue() == 0)) {
  42.           str.append(" " ).append(j);
  43.           this.posReps.put(String.valueOf(j), new Integer(this.numCd));
  44.           ((Vector)this.cdsMp3.get(String.valueOf(this.numCd))).add(new Integer(j));
  45.         }
  46.       str.append(" | " ).append(this.pertePlace);
  47.       System.out.println(str.toString());
  48.     }
  49.     while (this.posReps.contains(Integer.valueOf("0" )));
  50.   }
  51.   void backPack(int ind, long placeDispo) {
  52.     if (ind >= this.tailleReps.size()) { // si on est arrivé au bout de la liste
  53.       if (placeDispo < this.pertePlace) { // si on a trouvé une meilleure combinaison (moins de perte de place)
  54.         //* sauvegarde de la solution
  55.         for (int j=0 ; j < this.tailleReps.size() ; j++)
  56.           if ((this.meilleurCd[j] == 0) || (this.meilleurCd[j] == this.numCd)) // ne sauvegarder que les répertoires "libres"
  57.             this.meilleurCd[j] = this.cd[j];
  58.         this.pertePlace = placeDispo; // mettre à jour le résultat de cette combinaison (cd)
  59.       }
  60.     }
  61.     else {
  62.       if ( ( ((Integer)this.tailleReps.get(String.valueOf(ind))).intValue() < placeDispo)  && ((this.meilleurCd[ind] == 0) || (this.meilleurCd[ind] == this.numCd)) ) { // si le répertoire rentre dans l'espace disponible et qu'il est "libre"
  63.         this.cd[ind] = this.numCd; // inclure le répertoire dans cette combinaison (cd)
  64.         this.backPack(ind + 1, placeDispo - ((Integer)this.tailleReps.get(String.valueOf(ind))).intValue()); // passer au répertoire suivant
  65.       }
  66.       this.cd[ind] = 0; // exclure le répertoire de cette combinaison (cd)
  67.       this.backPack(ind + 1, placeDispo); // passer au répertoire suivant
  68.     }
  69.   }
  70. }


 
détails:
- l'idée est d'appliquer l'algo backpack plusieurs fois sur une liste d'éléments (tailleReps) afin de déterminer plusieurs sac-à-dos (en l'occurrence plusieurs cds de mp3)
- l'algo backpack a été implémenté en utilisant une fonction récursive (basé sur l'algo donné ICI)
- ces différents sac-à-dos trouvés sont stockés à la fois dans meilleurCd (pour le traitement récursif de l'algo backpack), dans posReps (pour la sauvegarde de la bonne solution - je pense pouvoir me passer de cet attribut, mais pour le moment il est là), et au final dans cdsMp3 ("inverse" de posReps: à chaque cd est associé l'Id des répertoires qui le constituent)
- les répertoires (enfin leurs capacités) sont issus d'une bdd, où sont associés un Id (col 1) et la taille en octets (col 2)
- la taille du média spécifiée par l'utilisateur est récupérée d'un ensemble de paramètres stockés dans une classe dont l'instance utilisée ici est params
 
nda: il s'agit de mp3 créés à partir de ma discothèque personnelle, le but étant de créer des cds spécifiquement pour ma discothèque de voiture


Message édité par trevor le 15-01-2006 à 14:12:57

---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 15-01-2006 à 14:09:44    

j'ai pas encore lu mais l'idée d'utiliser cet algo pour ç aest intéressante. [:bien]
 
par contre tes perfs sont innaceptables.

Reply

Marsh Posté le 15-01-2006 à 14:15:56    

http://www.enseignement.polytechni [...] e.html#310
tu as regardé du côté de ça ? peut-être que ça marche aussi avec des grands entiers (taille des répertoires en octets).

Reply

Marsh Posté le 15-01-2006 à 14:25:40    

bah j'ai donné le code parce qu'on me l'a proposé. je peux très bien comprendre qu'on ait ni le temps ni l'envie de se plonger le nez dedans ;) - et en + j'ai quand même essayé de garder uniquement les choses nécessaires... :)
 
je viens de refaire plusieurs tests (au moins 2x pour chaque) montre-en-main:
- 53s pour une liste de 29 reps
- 11s pour 25 reps
- 2-3s pour 20 reps
 
:\


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 15-01-2006 à 14:32:46    

nraynaud a écrit :

http://www.enseignement.polytechni [...] e.html#310
tu as regardé du côté de ça ? peut-être que ça marche aussi avec des grands entiers (taille des répertoires en octets).


 
non pas encore. je cherchais justement un algo type backpack pour les entiers, car j'ai lu, à la fois sur ce site, et ailleurs, que ce pb est non-polynomial dans le cas où la capacité est réelle. or, dans mon cas, en effet elle est entière.
j'ai cherché un peu - certainement mal - mais n'ai pas trouvé d'éléments de solutions - ou d'éléments de solutions que je comprenne en tout cas ;)
 
en revanche, sur le lien que tu donnes, il n'y a qu'une ligne, c'est normal ? je n'ai pas retrouvé cette ligne sur le site. de quel page est extraite cette info stp ?
 
(merci de m'aider au fait ;))


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 15-01-2006 à 14:39:35    

sur la page que tu as donnévers le milieu.

Reply

Marsh Posté le 15-01-2006 à 14:48:11    

nraynaud a écrit :

sur la page que tu as donnévers le milieu.


 
ah oui, chez moi (opera) l'image du lien n'est pas affiché, je croyais que c'était juste une image sans lien. voilà pourquoi je ne l'avais pas lu
ca confirme donc ce que j'avais cru comprendre. je vais donc me pencher sur cette programmation dynamique ;)


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed