JAVA : vector

butok

Membre actif
21 Mai 2006
189
13
39
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 :
Bloc de code:
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à.
 
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é !! :(:confused::( On vera bien :D
 
Comment est définie ta variable vect1 ?
Quelle version de java ? 1.4, 1.5 ou 1.6 ?
 
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).
 
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:
Bloc de code:
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 ;).
 
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)
 
Les Vector n'ont pas la taille fixe :mouais: ! Pour preuve, tu peux très bien faire:
Bloc de code:
    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).
 
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 :

Bloc de code:
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);
}
 
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 ! :eek: Et ben, c'est pas gagné :D :D :D :D
 
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.*;


public class oceanv2 {

public static void main(String args[]) {
Frame fenetre = new Frame ("sous l'ocean");
fenetre.setSize(800,600);
fenetre.setVisible(true);
Graphics gr = fenetre.getGraphics();
delay (100);

herbivore tbHerb[]=new herbivore[100];
tbHerb[0]=new herbivore(tbHerb);
tbHerb[1]=new herbivore(tbHerb);
tbHerb[2]=new herbivore(tbHerb);

pr&#233;dateur tbPr&#233;[]=new pr&#233;dateur[100];
tbPr&#233;[0]=new pr&#233;dateur(tbPr&#233;);
algue alg = new algue();


int nbt= 100 ;
try {
nbt =Integer.parseInt (args[0]);
}
catch (NumberFormatException nbe) {
System.out.println("il me faut un entier, je met 50");
nbt=50;
}
gr.setColor(Color.blue);
gr.fillRect(0,0,800,600);
alg.dessine(gr);

for (int t = 0; t< nbt; t++){
delay (50);

gr.setColor (Color.blue);
gr.fillRect (0,0,800,600);
alg.dessine(gr);
for (int i=0; i<100;i++){
if (tbHerb!=null){



tbHerb.choixdeplacement();


tbHerb.dessine(gr);







tbHerb.manger();
tbHerb.dessine(gr);

if (tbHerb.findevie==true){//&#233;crire de quoi est le fin de vie, puis &#233;crire supprimer.
tbHerb= null ;
System.out.println("hehe une mort r&#233;&#233;l");
}

}
}


for (int d=0; d<100; d++){

if (tbHerb[d]!=null){



for (int p=0; p<100; p++){
if (tbPr&#233;[p]!=null){

tbPr&#233;[p].choixdeplacement();

tbPr&#233;[p].dessine(gr);




if(((tbPr&#233;[p].getX())<(10+(tbHerb[d].getX())) && ((tbPr&#233;[p].getX())>(tbHerb[d].getX()-10))) && (((tbPr&#233;[p].getY())<(10+tbHerb[d].getY())) && ((tbPr&#233;[p].getY())>(tbHerb[d].getY()-10)))){

tbPr&#233;[p].chasser();
if (tbPr&#233;[p].viensdetuerunherbivore==true){
tbHerb[d]=null;


}
if (tbPr&#233;[p].loupyestu==true){
tbPr&#233;[p]=null;
System.out.println("vraie mort d'un pr&#233;dateur.");
}

}
}
}
}
}
}
System.out.println("la simulation est termin&#233;e.");


}
private static void delay(int ms) {
long time = System.currentTimeMillis();
while(System.currentTimeMillis()-time<ms);

}
}

;




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;
}
}

}


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;
}
}




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 ...)
 
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

Bloc de code:
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.
 
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.