# JAVA : vector



## butok (5 Juin 2007)

voila mon problème : j'utilise un vector,qui ne contient qu'un seul type d'objet (appelé herbivore).  Le vector est nommé vect1;
dans mon main, j'ia besoin d'utiliser des fonctions sur ces objets, du cousp j'ai écris ça :
	
	



```
for (int i=0; i<vect1.size();i++){
	    	  
	      alg.dessine(gr);
	      ((herbivore)vect1[i]).dessine(gr);
	      pre.dessine(gr);
	      ((herbivore)vect1[i]).choixdeplacement();
	      
	      pre.choixdeplacement();
	      if ((((pre.getX())<(10+((herbivore)vect1[i]).getX()))&&((pre.getX())>(10-  ((herbivore)vect1[i]).getX()))) && (((pre.getY())<(10+((herbivore)vect1[i]).getY()))&&((pre.getY())>(10-((herbivore)vect1[i]).getY())))){
	          pre.chasser();
	          }
	      gr.setColor (Color.blue); 
	      gr.fillRect (0,0,800,600); 
	      alg.dessine(gr);
	      ((herbivore)vect1[i]).manger();
	      ((herbivore)vect1[i]).dessine(gr);
	      pre.dessine(gr);
	      }
```


Mais eclipse me souligne tout les : vect1_ comme des erreures... je sèche là._


----------



## dmo95 (5 Juin 2007)

Bonsoir,

Oui en effet la classe Vector est une liste et non un tableau et donc elle se comporte comme une ArrayList(Sun conseil l'utilisation d'une ArrayList plutot qu'un Vector), il faut utiliser les méthodes de ArrayList tel que add, get, remove ...

Je suis qu'ne fin de première année d'IUT mais il me semble qu'il faut que tu remplace tes vect1_ par vect1.get(i), mais ensuite tu auras d'autres erreur du fait que tu recupère ton objet mais tu ne le met pas dans une autre variable. 

Ce n'est que le point de vu d'un débutant, j'ai eu partiel de java ce matin et j'ai tout planté !!  On vera bien _


----------



## ntx (5 Juin 2007)

Comment est définie ta variable vect1 ?
Quelle version de java ? 1.4, 1.5 ou 1.6 ?


----------



## dmo95 (5 Juin 2007)

C'est un truc comme ca ntx ??


----------



## ntx (5 Juin 2007)

Oui, tu peux déclarer tes tableaux soit à la façon C et accéder aux éléments avec l'"opérateur" [], soit comme une instance d'une classe Vector ou ArrayList, qui à partir de Java 1.5 sont typés : Vector<E>. 
Si tu veux un programme Java entièrement objet, il faut plutôt utiliser la seconde solution, la première est une réminiscence du C, ce n'est pas dans la philosophie objet (au point de vue Java car en C++, on a la notion d'opérateur qui est une fonction membre de la classe).


----------



## GrandGibus (6 Juin 2007)

En complément des réponses déjà formulées, voici quelques remarques: 

1°) Quand on utilise des collections en Java (Vector, ArrayList...), il convient de toujours utiliser _l'interface_ parente ! Dans ton cas, si ton modèle exige d'être manipulé comme une simple list, alors, utilise une _List_. 
Ainsi, tu auras: 

```
List mesHerbivores = new ArrayList()...
for (Iterator it=mesHerbivores.iterator(); it.hasNext(); ) {
    Herbivore herbi = (Herbivore)it.next;
}
```

Ceci rend ton code est insensible aux changements d'implémentation (i.e. tu peux remplacer ArrayList par Vector).


2°) La différence entre Vector et ArrayList se situe dans la synchronization des accesseurs. La classe Vector est synchronisée (threadsafe), ce qui fait que les thread l'accèdent "chacun son tour". Ca a une importance majeure en terme de performance (imagine 2 threads de rendu graphique, ils sont obligés d'attendre chacun leur tour pour accéder aux herbivores)


3°) Utilise un herbivore en début de corps de ta boucle, ainsi tu gagneras en temps d'accès.


Enfin, si tu es interessé par ce genre de questions, je ne saurais trop te conseiller la lecture de Java effective programming .


----------



## butok (6 Juin 2007)

Merci a vous, mais bon, mon prof du jour ne connaissant pas suffisament vector m'as demandé de faire un tableau ... ça m'emerde un peu car je voulais pas que le nombre max d'herbivores soit fixé ... mais bon ...  Avec le prof on a passé une demi-heure sans comprendre comment faire marcher vector donc ...


(oui les biologistes sont des quiches en informatique ...et alors ! hehe)


----------



## GrandGibus (6 Juin 2007)

Les Vector n'ont pas la taille fixe :mouais: ! Pour preuve, tu peux très bien faire:

```
List maListe = new Vector();
    maListe.add(new Herbivore("vache"));
    maListe.add(new Herbivore("cheval"));
    maListe.add(new Herbivore("rastafarai"));  // eux aussi ils aiment l'herbe
```

Si tu fais allusion au paramètre int du constructeur, lis bien la javadoc, c'est pour fixer le pas d'incrément (càd le nombre d'éléments instanciés lors du dépassement de capacité = pratique quand on fait des ajouts en masse).


----------



## Eul Mulot (6 Juin 2007)

Quel est ton soucis avec le Vector ? 

En tout cas en attendant tu peux toujours aller faire un petit tour sur la (moche) utile API Java : http://java.sun.com/j2se/1.4.2/docs/api/java/util/Vector.html

De plus avec la 1.5 tu peux profiter de l'auto unboxing pour simplifier et clarifier ton code, c'est ce dont ntx t'a fait par, c'est &#224; dire utiliser des Collections d'objets pr&#233;d&#233;finis.

Par Exemple :


```
public class ArrayListHerbivore extends ArrayList <Herbivore> {


public ArrayListHerbivore(){
   super();
}
...
}


ArrayListHerbivore alherb = new ArrayListHerbivore();

alherb.addnew Herbivore());

//Methode quelconque retournant un herbivore de l'array list
public void foo(){

//on utilise les propriete de Java 5 pour parcourir une collection 
for(Herbivore currentherb: alherb){
    System.out.println(currentherb);
}
```


----------



## ntx (6 Juin 2007)

butok a dit:


> mon prof du jour ne connaissant pas suffisament vector m'as demandé de faire un tableau


Donc en gros tu prends des cours de Java avec un prof qui ne sait pas programmer en Java, j'ajouterais même qui ne maîtrise pas la programmation objet !  Et ben, c'est pas gagné


----------



## butok (7 Juin 2007)

justement c'est pas gang&#233;, mais je DOIS finir ce programme et valid&#233; cette option de malheure ... (tout &#231;a car je voulais pas faire de la canc&#233;ro ... quel con , mais quel con ..)

enfin, du coups je suis pass&#233; en tableau simple. Et j'ai un probl&#232;me: 
le topo du programme, j'ai des herbivores qui mange des lagues quand ils passent sur ces algues (ca marche) au bout de plusieurs repas, il y a reproduction (&#231;a marche). au bout de plusieur reproduction l'herbivore meurt (ca marche).
En plus il y a des pr&#233;dateurs, ceux-ci font acte de chasser quand ils sont dans la zone d'un  herbivore, ils peuvent soit r&#233;ussir leur chasse (et donc tu&#233; un pr&#233;dateur), soit rat&#233;. Plusieurs chasses rat&#233; d'affil&#233; entrainnent la mort du pr&#233;dateur (&#231;a marche). au bout d'un certain nombre de chasses r&#233;ussi, il y a reproduction. 

Mes probl&#232;mes: Quand un pr&#233;dateur fait acte de reproduction, un deuxi&#232;me pr&#233;dateur apparait et tout &#231;a s'arrete, avec le message suivant :

Exception in thread "main" java.lang.NullPointerException
	at oceanv2.main(oceanv2.java:94)

ma classe oceanv2:


> import java.awt.*;
> import java.util.*;
> 
> 
> ...


_


ma classe pr&#233;dateur :



			import java.awt.*;

 class pr&#233;dateur extends espece{
	 int nbc ; // nombre de chasses
	 int nbcr ; // nombre de chasses r&#233;ussi = a manger l'herbivore
	 int nbcb ; // nombre de chasse bro******* depuis la derni&#232;re chasse r&#233;ussi!! (vive la galinette cendr&#233
	 int nbp ; // nombre de prog&#233;niture
     int c;    // tentative de chasse
     pr&#233;dateur tabgo[];
     boolean loupyestu= false;
     boolean viensdetuerunherbivore = false;

	 public pr&#233;dateur (int chasses, int chassesr&#233;ussi, int chassesbro*******, int prog&#233;niture) {
			super () ;
			//speed = 30 ;
			setnbc(chasses);
			setnbcr(chassesr&#233;ussi);
			setnbcb(chassesbro*******);
			setnbp(prog&#233;niture);
		}

	 public pr&#233;dateur (pr&#233;dateur tb[]){
			nbc=0;   // sinon on peux faire &#231;a :alea.nextInt(3);// on ne fixe donc pas la valeur de d&#233;part (c plus rigolo)
			nbcr=0;  // sinon on  peux faire &#231;a : alea.nextInt(3);
			nbcb=0;
			nbp=0;
			tabgo=tb;
		}
	 public int setnbc(int chasses) {
			while (chasses < 0)
				chasses =0;
	        return nbc=chasses ;

		}

	 public int getX () {
	    	return X;
	    }

	    public int getY () {
	    	return Y;
	    }

	 public int setnbcr(int chassesr&#233;ussi) {
			while (chassesr&#233;ussi < 0)
				chassesr&#233;ussi =0;
			while ( chassesr&#233;ussi > 3)
				chassesr&#233;ussi = 0;
	        return nbcr=chassesr&#233;ussi ;

		}

	 public int setnbcb(int chassesbro*******) {
			while (chassesbro******* < 0)
				chassesbro******* =0;	
			while (chassesbro*******>3)

			  chassesbro*******= 0;
	        return nbcb=chassesbro******* ;

		}

	 public int setnbp(int prog&#233;niture) {
			while (prog&#233;niture < 0)
				prog&#233;niture =0;
			while ( prog&#233;niture > 5)
				prog&#233;niture = 0;
	        return nbp=prog&#233;niture ;

		}
	 public void reproduction() {
		 if (nbcr>1){  // changer la valuer, c'est juste pour tester que j'ai mis 2.
			 System.out.println("Un nouveau pr&#233;dateur ...grrrrr!!!" );
			 int i=0;
			  while ((i<100)&&(tabgo!=null))
			    i=i+1;
			  if (i<100)
				  tabgo=new pr&#233;dateur(tabgo);

		 }
	 }
	 public void dessine (Graphics g) {
	     g.setColor (Color.red);
	     g.fillRect (X-10,Y-10,30,30);
	     viensdetuerunherbivore= false ; // (me permet de r&#233;initialiser le booleean apr&#232;s un chasse r&#233;ussi)
	    }
	 public void tentativedechasse () {
		 c=alea.nextInt(4);    // quand je ne mettais que deux, j'avais un al&#233;atoire tres mauvais qui fesait tout le temps 1 puis 2 puis 1, puis 2 ... Or je veux qu'il arrive que le pr&#233;dateur rate beaucoups de chasses d'affil&#233;, et en meurt.
		    if ((c==0) || (c==2)) {
		    	setnbcr(nbcr+1);
		    	setnbcb(nbcb=0);   // on a fait une chasse r&#233;ussi, donc le nombre de chasses bro*******s entre deux chasses r&#233;ussi repasse &#224; zero.
		   	 System.out.println("Chasse fructeuseuse");
		   	 reproduction () ;
		   	 viensdetuerunherbivore = true;
		    }
		    if ((c==1)||(c==3)||(c==4)){
		    	setnbcb(nbcb+1);
		    	mourrir();
			 System.out.println("Chasse bro*******");


		    }
	 }
	 public void chasser() {
		 setnbc(nbc+1);
		 tentativedechasse() ;
	 }

	 public void affichepositionp() {        // pour tester (car j'ai des doutes que la chasse se face au bon endroit, et je comprend pas ou &#231;a *******
			System.out.println("le pr&#233;dateur est en" +getX()+ ";" +getY()  );
		}


	 public void mourrir() {
		 if (nbcb>3){ // j'introduit l'id&#233;e que des chasses c'est de la d&#233;pense d'&#233;nergie , et au della de trois chasses rat&#233; d'affil&#233;, il meurt  // attention il faut que  nbcp soit r&#233;initialis&#233; apres une chasse r&#233;ussi !!  
		 System.out.println("Un pr&#233;dateur viens de mourrir");
		 loupyestu=true;
		 }
	 }

}


Cliquez pour agrandir...



et ma classe herbivore :




			import java.awt.*;
import java.util.*;

 class herbivore extends espece {
     int nbr; // nombre de repas 
     int nbe; // nombre d'enfants
     herbivore tabref[];
     boolean findevie = false;
	public herbivore (int repas, int enfants ) {
		super () ;
		//speed = 10 ;

		setnbr(repas);
		setnbe(enfants);
	}
	public herbivore (herbivore tb[]){
		nbr=alea.nextInt(3);// on ne fixe donc pas la valeur de d&#233;part (c plus rigolo)
		nbe=alea.nextInt(3);
		tabref=tb;
	}


	public int getNbr() {
		return nbr;
	}

    public int getX () {
    	return X;
    }

    public int getY () {
    	return Y;
    }

	public int setnbr(int repas) {
		while (repas < 0)
			repas =0;
		while ( repas > 11)
			repas = 0;
        return nbr=repas ;

	}
	public int setnbe(int enfants) {
		while (enfants < 0)
			enfants =0;
		while ( enfants > 3)
		mourrir();
		enfants=0;
		return enfants;

	}


	 public void dessine (Graphics g) {
	     g.setColor (Color.black);
	     g.fillRect (X-10,Y-10,20,20);
	    }

	 public void manger () {
		 if (((X>300)&&(X<(400)) &&((Y>200)&&(Y<400)))) { // donc si herbivore est sur algue.
			 setnbr(nbr+1);
			 System.out.println("Un bon repas pour  un des herbivores ");
		 }
		 else 
			 nbr=nbr;


		 if (nbr>10) {
			 reproduction () ;
		 }

          }
	 public void reproduction () {

		 nbr= 0;
		 nbe=nbe+1;
		 System.out.println("Un nouvel herbivore est apparue, n'est ce pas merveilleux ?" );
		 int i=0;
		  while ((i<100)&&(tabref!=null))
		    i=i+1;
		  if (i<100)
			  tabref=new herbivore(tabref);

		 if (nbe>3) {
			 mourrir () ;
			 nbe=0;
		 }

	 }
	public void affichepositionh() {   // j'en ai eu besoin pendant la construction du programme , pour tester la methode chasse(); je laisse, pour d'&#233;ventuel test ult&#233;rieurs.
		System.out.println("l'herbivore est en" +getX()+ ";" +getY()  );
	}

	 public void mourrir () {
		 System.out.println("Un herbivore meurt : C ETAIT PAS MA GUERRE!!!");
	       findevie=true;
	 }
}


Cliquez pour agrandir...





J'avoue que je suis en grand d&#233;sarrois. L'&#233;rreure pointe sur mon grand if qui rep&#232;re si le pr&#233;dateur est dans la zone d'un herbivore. je comprend pas vraiment comment corrig&#233;, car je ne saissie pas mon erreure.   
Si vous pouviez m'aider, je serais...  MAIS TROP CONTENT SA MERE (comme on dit chez nous quand on  est trop content ..hehe)


(EDIT) : enorme: je viens de voir qu'il y a un correcteur d'insulte sur le forum ... il n'accepte pas ma chasse b r o c o u i l l e  (en r&#233;ference aux inconnus ...)_


----------



## Eul Mulot (7 Juin 2007)

Oula, j'ai essay&#233; de lire ton code mais j'ai plusieurs remarques &#224; te faire;

- d'une il faut choisir des noms de variables potables: qui repr&#233;sentent clairement &#224; quoi elles correspondent, bref des variables mn&#233;moniques.

- les noms de variables sont en minuscule, et les eventuelles constantes en majuscule, et ne pas h&#233;siter &#224; utiliser des underscores pour rendre &#231;a un peu plus lisible.

- il y a des m&#233;thodes &#233;tranges, du genre "loupyestu" pour les pr&#233;dateurs, c'est marrant mais  compr&#233;hensible uniquement si on fait un certain effort (surtout en ne connaissant pas le code), de plus les m&#233;thodes ont une syntaxe particuli&#232;re &#224; "respecter": le premier mot de la m&#233;thode ne prend pas de majuscule et les suivants en prennent une, exemle


```
public Herbivore currentSelectedHerbivore(){
...
}
```
Ce que je peux te dire, c'est qu'un null pointer exception correpond au fait qu'une m&#233;thode &#224; &#233;t&#233; appliqu&#233;e sur un objet null, donc essaye de saisir &#224; quelel ligne &#231;a se produit et dans quelle situation, si c'est dans un tableau, ou lors de l'affection d'une m&#233;thode retournant un objet &#224; ta variable produisant l'erreur.

L&#224; j'ai pas vraiment le temps de regarder, plein partiels, j'y jetterai un coup d'&#339;il dimanche.

Bon courage.


----------



## butok (7 Juin 2007)

Ben désoler pour la synthaxe tout ça ... mais bon ... je fais de la bio moi . (l'info ça fait  un mois qu'on en fait, y nous demande des trucs on comprend rien, et on arrete de toute façon lundi ...)

Mais je comprend un peu ou j'ai un problème, j'ai un retour sur un element de tableau qui parfois est nul, mais je sais pas comment faire pour qu'il ne prenne pas enb compte cette element, et qu'il passe directement au suivant par exemple.


----------



## butok (7 Juin 2007)

C'est bon , j'ai réussi , meric !!! AYE AYE tout fonctchionne !!! c'est trop bon; merci !


----------

