ArrayLists de int[] dans un ArrayList...

ArrayLists de int[] dans un ArrayList... - Java - Programmation

Marsh Posté le 07-11-2017 à 21:21:58    

Bonjour
 
Je poursuis mon apprentissage de Java : codingame en ce moment
 
Je sèche.  C'est la première fois que j'utilise un ArrayList, en plus direct je l’emboîte dans un autre ArrayList.
 
Je n'arrive pas pas ajouter mes int[] (de 2 int) dans un ArrayList situé dans un autre ArrayList
 

Code :
  1. private ArrayList<ArrayList<int[]>> isExit (int EI, ArrayList<int[]> nodes)  {
  2.    
  3.         ArrayList<ArrayList<int[]>> arrExit;
  4.         for (int i=0 ; i<20 ; i++)  {            // faut que je les déclare ?  Ca ne passe pas ('.class' expected)
  5.             arrExit.add(ArrayList<int[]> );
  6.         }
  7.    
  8.         for (int[] coord : nodes)  {
  9.        
  10.             if (coord[0] == EI || coord[1] == EI)  {
  11.            
  12.                 int temp[] = {coord[0], coord[1]};
  13.            
  14.                 arrExit(EI).add(temp);   // Et comment j'insère mes int[] dans les ArrayList dans l'ArrayList ?  Je ne sais pas faire...
  15.                
  16.             }
  17.         }
  18.         return arrExit;
  19. }


 
Merci pour votre aide !


Message édité par Lt Ripley le 07-11-2017 à 21:23:51
Reply

Marsh Posté le 07-11-2017 à 21:21:58   

Reply

Marsh Posté le 08-11-2017 à 13:19:29    

Citation :

Je poursuis mon apprentissage de Java : codingame en ce moment
 
Je sèche.  C'est la première fois que j'utilise un ArrayList, en plus direct je l’emboîte dans un autre ArrayList.


Aller lire un tutoriel java ou deux pourrait être une bonne idée non? Et lire les messages du compilateur

Code :
  1. ArrayList<ArrayList<int[]>> arrExit


Java fait pas dans la conception virginale, là t'as déclaré une variable d'un certain type mais t'as rien mis dedans, Java risque de pas être content.

Code :
  1. arrExit.add(ArrayList<int[]> );


Initialiser un objet ça se fait avec "new", "ArrayList<int[]>" c'est une classe qui n'est pas intrinsèquement un objet, s'pour ça que le compilateur te suggère de rajouter ".class" pour récupérer un objet classe. Si tu fais ça (et que t'enlèves le <int[]> parce-que Java gère pas les objets classe générique) il va te dire que tu peux pas mettre une classe dans ton ArrayList:

Citation :

error: no suitable method found for add(Class<ArrayList> )


En java, les objets sont initialisés avec "new".

Code :
  1. arrExit(EI).add(temp);   // Et comment j'insère mes int[] dans les ArrayList dans l'ArrayList ?  Je ne sais pas faire…


Ce truc veut strictement rien dire, une arraylist c'est pas une méthode, ça s'appelle pas. T'as songé à aller lire la doc?


Message édité par masklinn le 08-11-2017 à 13:19:59

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 08-11-2017 à 14:37:22    

Merci beaucoup pour tes explications.
 
Je me rends compte que je suis à la ramasse.
 
Je vais aller lire la doc
 
Merci !!
 
Edit : pour New je suis bien content d'avoir appris qu'on initialise avec, j'avais souvent eu des problemes à ce niveau.


Message édité par Lt Ripley le 08-11-2017 à 14:40:51
Reply

Marsh Posté le 11-11-2017 à 19:31:10    

Bon j'y suis arrivé !  J'ai voulu utiliser des Vectors (qui me semblent en fin de compte bien similaires aux ArrayList) car en c++ on y accède comme ça : vector[i][j].  Mais pas en Java !  Même si en fait c'est simple : vector.get(i).get(j)[k]  pour un Vector de Vectors de int[], avec les set qui vont bien à l'aide de Vectors temp reconstitués.
 
Voici la déclaration et initialisation de mon Vector de Vector principal
 

Code :
  1. Vector<Vector<int[]>> vecvec = new Vector<Vector<int[]>>();
  2.         for (int i = 0 ; i < N ; i++) { vecvec.addElement(new Vector<int[]>()) ; }


 
Et une méthode
 

Code :
  1. // définir le 3eme int à 1 dans les int[] s'il s'agit d'un exit
  2.     private static Vector<Vector<int[]>> setExit (int[] tableauExit, Vector<Vector<int[]>> vecvec)  {
  3.      
  4.         for (int i = 0 ; i < vecvec.size() ; i++) {
  5.        
  6.             for (int j = 0 ; j < vecvec.get(i).size() ; j++) {
  7.                
  8.                 for (int SI : tableauExit) {
  9.            
  10.                     if ((vecvec.get(i).get(j)[0] == SI) || (vecvec.get(i).get(j)[1] == SI)) {
  11.                    
  12.                         Vector<int[]> vecTemp = vecvec.get(i);
  13.                        
  14.                         int[] tempTab = { vecvec.get(i).get(j)[0] , vecvec.get(i).get(j)[1] , 1}; // passage à 1 au lieu de 0
  15.                        
  16.                         vecTemp.set(j, tempTab);
  17.                        
  18.                         vecvec.set(i, vecTemp);
  19.                     }
  20.                 }
  21.             }     
  22.         }
  23.         return vecvec;
  24.     }


 
Je vais continuer à lire la doc des ArrayList pour y passer définitivement, mais apparemment c'est kif kif, au moins à mon niveau
 
Et puis je capte bien mieux comment utiliser une methode (avant j'avais des variables globales  [:tinostar])
 
Merci encore

Message cité 1 fois
Message édité par Lt Ripley le 11-11-2017 à 20:37:47
Reply

Marsh Posté le 11-11-2017 à 20:40:25    

Lt Ripley a écrit :

Bon j'y suis arrivé !  J'ai voulu utiliser des Vectors (qui me semblent en fin de compte bien similaires aux ArrayList)


Vector c'est une "ancienne" version d'ArrayList (qui a été mis à jour par la suite pour être plus proche, c'est pour ça qu'il y a des méthodes redondantes genre add et addElement). C'est pas utilisé dans le code moderne. Idem Hashtable (vieux) contre HashMap (moderne) et Enumeration (vieux) contre Iterator (moderne). Ç'est équivalent, mais les lecteurs/collègues vont se poser des questions s'ils te voient utiliser Vector.

Lt Ripley a écrit :

car en c++ on y accède comme ça : vector[i][j].  Mais pas en Java !


Nope, pas de surcharge d'opérateurs en Java, donc l'indexation avec [] c'est uniquement pour les arrays "natifs".

Code :
  1. for (int i = 0 ; i < vecvec.size() ; i++) {


Tu peux itérer sur une collection (vecteur ou arraylist) comme sur un array, donc la boucle externe peut devenir:

Code :
  1. for (List<int[]> vecTemp: vecvec) {


Code :
  1. int[] tempTab = { vecvec.get(i).get(j)[0] , vecvec.get(i).get(j)[1] , 1}; // passage à 1 au lieu de 0


Au final tu utilises pas vraiment ton int[] comme un array, plus comme une structure, en Java "normal" tu définirais une classe dédiée pour ça.


Message édité par masklinn le 11-11-2017 à 20:40:37

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 11-11-2017 à 21:01:18    

Merci beaucoup pour ces nouvelles infos !
 
Je vais bosser dessus, je posterai mon nouveau code  [:cerveau sol]

Reply

Marsh Posté le 11-11-2017 à 22:43:02    

Ça y est j'ai créé une classe interne au lieu d'un int[]
 

Code :
  1. class Lien {
  2.     int a = 0;
  3.     int b = 0;
  4.     boolean isExit = false;
  5.        
  6.     public Lien(int N1, int N2, boolean isE) {
  7.         a = N1;
  8.         b = N2;
  9.         isExit = isE
  10.     }
  11.    
  12.     public int getA () {
  13.         return a; 
  14.     }
  15.    
  16.     public int getB () {
  17.         return b; 
  18.     }
  19.    
  20.     public void setIsExit(boolean bool) {
  21.         isExit = bool
  22.     }
  23.    
  24.     public boolean getIsExit() {
  25.         return isExit;
  26.     }
  27. }


 
J'ai remplacé l'intégralité de mes Vectors par des ArrayList : Il n'y a que les .addElement() qui ne passaient plus.  Il faut utiliser .add()
 
Pour l'instant je garde mes itérations à la "i++" car je trouve plus lisible à mon oeil  (je savais qu'on pouvait itérer à la manière que tu m'as indiquée)
 
Ça marche impeccable
 
Je m'étonne moi même, j'ai mis une poignée de minutes


Message édité par Lt Ripley le 13-11-2017 à 11:47:40
Reply

Sujets relatifs:

Leave a Replay

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