Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
625 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[java] Philosophie java

n°722288
Giz
Posté le 11-05-2004 à 18:10:17  profilanswer
 

Reprise du message précédent :
Un petit detail :
Soit une classe interne toto dans une autre classe :

public class parent
{
 public class toto
 {
  public void sort (...)
 }
 toto[] ex = new toto[20];
 ex.sort //compile pas
}

la ligne ex.sort ne compile pas car ex est un tableau.
les seuls 2 solutions sont bien :
-ex[0].sort(ex);//utliser la 1ere valeur par exmple pour l'appel
-toto bidon;//cree une variable bidon pour l'appel
bidon.sort(ex);
 
J'aurai voulu faire un truc du style toto.sort(ex) mais pour cela faut mettre la classe et la fonction en statique ce qui est refuse pour une classe interne par le compilo :/
Y'a-t-il mieux que les 2 solutions que j'ai propose ?


Message édité par Giz le 11-05-2004 à 18:10:48
mood
Publicité
Posté le 11-05-2004 à 18:10:17  profilanswer
 

n°722329
gfive
Posté le 11-05-2004 à 18:46:30  profilanswer
 

Tu crées une inner-class qui implémente comparator, et tu fais :  
Arrays.sort(ex, comparateur)  
 
ou alors, sans inner-class, avec la méthode de nraynaud (instanciation d'un comparateur avec redéfinition de la méthode compare)
 
ou encore, tu t'arranges pour que la classe toto implémente l'interface Comparable, et tu fais Arrays.sort(ex)

n°722338
Taz
bisounours-codeur
Posté le 11-05-2004 à 18:49:57  profilanswer
 

ex.sort //compile pas  
 
 
sans déconner ? tu crois faire quoi avec cette instruction ?

n°722345
nraynaud
lol
Posté le 11-05-2004 à 18:54:37  profilanswer
 

Taz a écrit :

ex.sort //compile pas  
 
 
sans déconner ? tu crois faire quoi avec cette instruction ?

prendre un pointeur sur la fonction biensûr ...


---------------
trainoo.com, c'est fini
n°722349
Taz
bisounours-codeur
Posté le 11-05-2004 à 18:56:59  profilanswer
 

:D

n°722354
Giz
Posté le 11-05-2004 à 19:00:45  profilanswer
 

gfive a écrit :

Tu crées une inner-class qui implémente comparator, et tu fais :  
Arrays.sort(ex, comparateur)

 
ou alors, sans inner-class, avec la méthode de nraynaud (instanciation d'un comparateur avec redéfinition de la méthode compare)
 
ou encore, tu t'arranges pour que la classe toto implémente l'interface Comparable, et tu fais Arrays.sort(ex)


 
Justement cette inner-class c ma classe toto, elle,  ds la definition de sort (toto[]), elle contient l'appel a :
Arrays.sort ((Object[])tot, Comparator cmp);
 
dans la classe parent je peux faire ex[0].sort(ex) par exemple

n°722362
the real m​oins moins
Posté le 11-05-2004 à 19:03:22  profilanswer
 

[:le kneu]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°722365
nraynaud
lol
Posté le 11-05-2004 à 19:04:37  profilanswer
 

à propos, ça se passe comment en C++ si je fais ça ? j'aurais un truc avec le "this" déjà attaché et je peux l'appeller plus tard avec les paramètres qui manquent ? comme en C# et ses machins dont j'ai oublié le nom ?


---------------
trainoo.com, c'est fini
n°722383
Taz
bisounours-codeur
Posté le 11-05-2004 à 19:13:44  profilanswer
 

non, en C++, les méthodes ne sont pas attachées à l'instance (comme ça peut se faire en python)
 
faut donc faire des delegate à la main (C# propose une petit fonctionnalité pour pas avoir à tout coder à chaque fois
 
y a tout ce qui faut dans STL pour faire ça, mais même à coder, c'est pas violent du tout

n°722406
nraynaud
lol
Posté le 11-05-2004 à 19:39:06  profilanswer
 

Taz a écrit :

non, en C++, les méthodes ne sont pas attachées à l'instance (comme ça peut se faire en python)
 
faut donc faire des delegate à la main (C# propose une petit fonctionnalité pour pas avoir à tout coder à chaque fois
 
y a tout ce qui faut dans STL pour faire ça, mais même à coder, c'est pas violent du tout

c'est bien ce qu'il me semblait. et techniquement, ça serait typé comment l'expression que notre cher noob nous a montré ? avec un paramètre en plus (pour this) en première position ?


---------------
trainoo.com, c'est fini
mood
Publicité
Posté le 11-05-2004 à 19:39:06  profilanswer
 

n°722428
Giz
Posté le 11-05-2004 à 19:53:28  profilanswer
 

Taz a écrit :

non, en C++, les méthodes ne sont pas attachées à l'instance (comme ça peut se faire en python)
 
faut donc faire des delegate à la main (C# propose une petit fonctionnalité pour pas avoir à tout coder à chaque fois
 
y a tout ce qui faut dans STL pour faire ça, mais même à coder, c'est pas violent du tout


 
rassure moi, ex.sort(...) ne marche pas seulement parce que ex est un tableau  :heink: (je comprends pas tout avec votre baratin) . D'autre part je comprends pas ta remark en gras  :??:

n°722432
Taz
bisounours-codeur
Posté le 11-05-2004 à 19:59:13  profilanswer
 

oui, ça ne sert qu'à vraiment qu'à faire de l'emrobage
 
au final, en C++ t'as toujours (instance.*pointer)( ... )
y a de quoi faire ça très bien avec boost::function<>
 
pour python, tu ne crois pas si bien dire, la déclaration de fonction membre se comme suit
def fonction(self, ...):
    <corps>
 
en C#, la déclaration de delegate est commune aux fonctions membres statiques et liées
 
delegate void D(int x);
D statique = new D( Classe.Fonction1 );
D liée     = new D( instance.Fonction2 );
 
statique( ... );
liée( ... );

n°722436
Taz
bisounours-codeur
Posté le 11-05-2004 à 20:04:21  profilanswer
 

je rajoute que le truc lourdingue en C#, c'est au niveau des fonctionnalités des delegate, l'abstraction fuit.
D d1 = ...;
D d2 = ...;
D d3 = d1 + d2;
d3() // d1(), puis d2();
 
D d4 = d1( d2 ); // boum, pas moyen de faire d1 ° d2
 
alors qu'en C++, avec la sauce template, tu moment que d() est syntaxiquement correcte tout passe, bref ça se fait s'en problème.
en python aussi bien évidemment.

n°722442
Giz
Posté le 11-05-2004 à 20:08:44  profilanswer
 

Taz a écrit :

oui, ça ne sert qu'à vraiment qu'à faire de l'emrobage
 
au final, en C++ t'as toujours (instance.*pointer)( ... )
y a de quoi faire ça très bien avec boost::function<>

 
pour python, tu ne crois pas si bien dire, la déclaration de fonction membre se comme suit
def fonction(self, ...):
    <corps>
 
en C#, la déclaration de delegate est commune aux fonctions membres statiques et liées
 
delegate void D(int x);
D statique = new D( Classe.Fonction1 );
D liée     = new D( instance.Fonction2 );
 
statique( ... );
liée( ... );


 
Oui, en gros tu veux dire qu'une methode appele via une instance n'est rien d'autre qu'un pointeur deferencer sur le code de la fct. En java c pareil sauf que tout est reference (= pointeur sans les etoiles).
Sinon Python et C# je connais pas, et boost::function<> non plus  [:spamafote]

n°722443
nraynaud
lol
Posté le 11-05-2004 à 20:13:47  profilanswer
 

Taz a écrit :


au final, en C++ t'as toujours (instance.*pointer)( ... )

ah oui, merde. Bon on va tenter d'éviter le C++ aussi longtemps que possible.
 
une précision pour ceux qui se demandent pour java (c'est bon, le topic est pourri) : j'ai déjà montré qu'avec une classe interne annonyme, on capture tout le contexte, ce qui veut dire qu'on peut avoir des objets qui représentent des méthodes, et on peut capturer l'instance et applicque la chose plus tard, comme en C++ avec l'infrastructure dont parle Taz et en python (évidement, il a des vraies closures aussi).


---------------
trainoo.com, c'est fini
n°722445
Giz
Posté le 11-05-2004 à 20:18:17  profilanswer
 

nraynaud a écrit :

ah oui, merde. Bon on va tenter d'éviter le C++ aussi longtemps que possible.
 
une précision pour ceux qui se demandent pour java (c'est bon, le topic est pourri) : j'ai déjà montré qu'avec une classe interne annonyme, on capture tout le contexte, ce qui veut dire qu'on peut avoir des objets qui représentent des méthodes, et on peut capturer l'instance et applicque la chose plus tard, comme en C++ avec l'infrastructure dont parle Taz et en python (évidement, il a des vraies closures aussi).


 
Ouai merci, on peut se passer de ta remarque hein  :o
 
EDIT : on pas tous code pendant 30 ans en Java


Message édité par Giz le 11-05-2004 à 20:20:21
n°722448
Taz
bisounours-codeur
Posté le 11-05-2004 à 20:19:14  profilanswer
 

Giz a écrit :

Oui, en gros tu veux dire qu'une methode appele via une instance n'est rien d'autre qu'un pointeur deferencer sur le code de la fct. En java c pareil sauf que tout est reference (= pointeur sans les etoiles).

voir ce que vient de dire nraynaud et ce qu'il a dit tout à l'heure ironiquement sur les fonctions. en java, les fonctions/fonctions_membres ne sont pas des objets de premier ordre, il faut donc ruser. En C++, on se repose sur les template dans tous les sens (STL et boost), en java, on fait comme nraynaud a dit, et on arrive avec plus ou moins de mal à un résultat

n°722504
nraynaud
lol
Posté le 11-05-2004 à 21:14:55  profilanswer
 

Giz a écrit :

Ouai merci, on peut se passer de ta remarque hein  :o
 
EDIT : on pas tous code pendant 30 ans en Java

heu quand je disais qu'il est pourri, c'est rapport au pourrissage que j'ai initié par des question sans rapport avec le sujet, pas le sujet de départ que j'ai déjà oublié.


---------------
trainoo.com, c'est fini
n°723057
Giz
Posté le 12-05-2004 à 12:43:54  profilanswer
 

gfive a écrit :

Tu crées une inner-class qui implémente comparator, et tu fais :  
Arrays.sort(ex, comparateur)

 
ou alors, sans inner-class, avec la méthode de nraynaud (instanciation d'un comparateur avec redéfinition de la méthode compare)
 
ou encore, tu t'arranges pour que la classe toto implémente l'interface Comparable, et tu fais Arrays.sort(ex)


 
chouette ca compile mon truc :)
Mais j'aimerais revenir sur l'histoire de l'appel a sort.
J'ai fais ce qu'il y a en gras :
 
mon code est :
 


public class ElitistAnt implements Comparator
 {
  public int eval;
  public int numAnt;
  Comparator cmp;
   
  public void eaSort (ElitistAnt[] ea)
  {
   Arrays.sort ((Object[])ea, cmp);
  }
   
  public int compare(Object o1, Object o2)
  {
   return ((ElitistAnt) o1).eval - ((ElitistAnt) o2).eval;
  }
 }


 
Bien alors ci-dessus vous avez tous le code de la inner-class.
Dans la classe englobante je fais :
 


private ElitistAnt[] eAnts;
...
eAnts[0].eaSort (eAnts);


 
Donc je reviens a ma question, soit je peux faire l'appel a eaSort() comme ci-dessus soit en creant un objet bidon : est-ce la seule solution ?

n°723175
gfive
Posté le 12-05-2004 à 14:15:20  profilanswer
 

houlà....C'est pas encore à ça que je pensais....
 
En gros, dans ta classe, tu crées une inner-class et une instance statique de cette inner class :  

Code :
  1. public static ElitistAnt cmp = new ElitistAmp();
  2. class ElitistAnt implements Comparator {
  3.   public ElitistAnt() {
  4.   }
  5. public int compare(Object o1, Object o2) {
  6.   return ((ElitistAnt) o1).eval - ((ElitistAnt) o2).eval;
  7. }
  8. }


 
Et quand tu veux trier ton tableau, tu fais :  
 
Arrays.sort(eAnts, cmp);
 
ou alors, autre solution (suggérée pas nraynaud) :  
 

Code :
  1. public static Comparator cmp = new Comparator() {
  2.      public int compare(Object o1, Object o2) {
  3.       return ((ElitistAnt) o1).eval - ((ElitistAnt) o2).eval;
  4.      }
  5.    };


 
et pour comparer : Arrays.sort(eAnts, cmp);
 
ce qui te fait une classe de moins.


Message édité par gfive le 12-05-2004 à 14:18:02
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[java] faire son navigateur[Java] Probleme de dependance/package/import [resolu]
[Java] appel du constructeur[XML - MathML - Java] Interpréter du MathML dans du Java (SWING)
[Java]Image de fond[java] swing : comment réaliser un arbre binaire
[Java] une erreur d'operation concurrente... je seche.[JAVA] Nombre limite de thread
[java] un problème d'accesseurs....[java] JTable : y a t'il un moyen de donner un nom aux lignes
Plus de sujets relatifs à : [java] Philosophie java


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR