Partage
  • Partager sur Facebook
  • Partager sur Twitter

ArrayList lui-même dans un autre ArrayList

Sujet résolu
12 avril 2011 à 15:28:42

Salut,
je pense que mon titre est assez parlant ...
J'ai fait tout un petit code d'essai.
Voici le fonctionnement :
ARfinal est un ArrayList contenant un autre ArrayList qui est ARresult.
ARresult quant à lui est un ArrayList contenant des String.
Voici ma class :

Classe Main.java
import java.util.ArrayList;


public class Main {

/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Sdz1 sdz = new Sdz1();
		ArrayList<ArrayList> res=sdz.get();
		for(ArrayList<String> col: res){
			for(String text: col){
				System.out.println("->\t"+text);
			}
			
		}
		
	}

}


Classe Sdz1.java

import java.util.*;

class Sdz1{
	private ArrayList<ArrayList> ARfinal = new ArrayList<ArrayList>();
	private ArrayList<String> ARresult  = new ArrayList<String>(); 
	
	void Sdz1(){
		
	}
	
	ArrayList get(){
		
		
		String[] tmp={"aaa", "bbb", "ccc", "ddd","eee","fff","ggg"};
		String[] tmp2={"aaaaa", "bbbbb", "ccccc", "ddddd","eeeee","fffff","ggggg"};
		for(String text: tmp){
			ARresult.add(text);
		}
		ARfinal.add(ARresult);
		ARresult.clear();
		for(String text: tmp){
			ARresult.add(text);
		}
		ARfinal.add(ARresult);
		ARresult.clear();
		
		return ARfinal;
	}
	
}


Et voilà, ça ne marche pas ...
Ca donne :
Rien du tout !
Par contre, si je met ça :
public static void main(String[] args) {
		// TODO Auto-generated method stub
		Sdz1 sdz = new Sdz1();
		ArrayList<ArrayList> res=sdz.get();
		for(ArrayList col: res){
			for(String text: col){
				System.out.println("->\t"+text);
			}
			
		}
		
	}


Ca donne :
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from element type Object to String

at Main.main(Main.java:14)


Je suis coincé depuis une bonne heure ... >_<:'(
Merci d'avance !
  • Partager sur Facebook
  • Partager sur Twitter
12 avril 2011 à 22:23:19

Hello, le premier problème c'est que tu clear les arrayList que tu enregistre voilà pourquoi il ne te retourne rien pis l'autre erreur c'est que tu ne définit pas les objet que contient l'arrayList de string se qui te génère cette erreur(soit tu parse l'objet en String soit tu mes <String> devant ton arrayList)
  • Partager sur Facebook
  • Partager sur Twitter
13 avril 2011 à 8:06:53

Merci !
En relisant le livre hier soir j'ai vu la méthode removeAll() ...
Et je me suis dis "c'est le clear() ) qui doit faire tout foiré" ...
En fait, j'avais simplement trouvé dans les proposition la méthode clear(), et trouvant son nom explicite ...

Merci beaucoup !
  • Partager sur Facebook
  • Partager sur Twitter
14 avril 2011 à 9:31:02

Hep, je viens de mettre en application ...
Et je voit pas comment faire.
Et oui, c'est vrai que clear() vide tout ... Mais pourquoi vide-t-il aussi ARfinal !!
Je n'ai pourtant appelé la méthode que sur ARresult ! Et seulement après avoir ajouté ARresult à ARfinal ...
A moins que contrairement à ce que je pensais, un objet ajouté dans un ArrayList n'est pas figé ... Et qu'il change si l'objet change ... c'est ça ?
Alors y a-t-il moyen de faire un ArrayList "Figé" ?
Merci.
  • Partager sur Facebook
  • Partager sur Twitter
14 avril 2011 à 12:24:34

J'ai du mal à comprendre ton code... Tu crées un tableau de tableau, tu le remplis puis tu le vides puis tu le re-remplis ? Que cherches-tu à faire...

Sinon pour te donner un vague piste, je dirais "pense à la méthode clone()" mais il me semble que ce n'est que conteourner le problème qui vient de ton code assez... particulier.

  • Partager sur Facebook
  • Partager sur Twitter
14 avril 2011 à 13:27:00

Salut,
ta remarque est pertinente ...
En fait, ceci n'est qu'un code d'essai.
En fait, je cherche à faire ça pour lire du CSV :
Voilà le scénario :

String[] Lines //contient toute les lignes
for(Lines){ // on parcourt chaques lignes
  // Ce qui suit est le traitement des données
  // on split les données
  while(conditions){
    // On traite chaque résultat un par un
     ARresult.add(tmp); // ARresult est un  ArrayList<String>. tmp contient les resultats
  }
  
  ARfinal.add(ARresult); // On ajoute les résultat de cette lignes à ARfinal qui est de type ArrayList<ArrayList>

 /*
*  Et là, important ! Il faut vider ARresult (pour la boucle suivante), sans que ça joue sur ARfinal !!
*/

}
return ARfinal


Bon, voilà les causes ...
Je pense que c'est un bon plan, qu'en pensez-vous ?

Voilà, merci pour la piste !
C'est vrai, j'avais entrevu clone() ...
Merci, je vais voir ça ...
  • Partager sur Facebook
  • Partager sur Twitter
14 avril 2011 à 13:53:21

Salut, clear supprime tout ce qu'il y a dans ton ArrayList, même les autres ArrayList qui sont dans ton ArrayList sont supprimée, enfin le nom de la méthode est très claire.
Si je me rappelle bien, si tu veux pas vider ce qu'il y a dans ARfinal, tu dois utiliser une autre méthode, je penses que c'est removeAll son nom. ^^
Sinon il y a addAll si tu veux ajouter les élément d'une liste dans une autre liste, ainsi tu n'est pas obligé de faire une ArrayList contenant une autre ArrayList...
  • Partager sur Facebook
  • Partager sur Twitter
14 avril 2011 à 13:59:58

Citation : StarShadow


Sinon il y a addAll si tu veux ajouter les élément d'une liste dans une autre liste, ainsi tu n'est pas obligé de faire une ArrayList contenant une autre ArrayList...



Justement pas, il me faut un tableau comme ceci :
{{col1, col2, col3},{item_a1, item_a2, item_a3},{item_b1, item_b2, item_b3}}

Don d'accord, en fait, un ArrayList est figé, sauf si on utilise clear !

Bon, déjà j'ai pas sût utiliser clone() :
j'ai essayé ça :
ARfinal.add(ARresult.clone());
Bon, ça marche pas ...
Et c'est pas mieux avec removeAll .. mais aussi, l'ai-je bien utiliser ?
ARresult.removeAll(ARresult);

J'ai pas trouvé comment faire autrement ...
Le constructeur prend obligatoirement une collection ...

Merci.
  • Partager sur Facebook
  • Partager sur Twitter
15 avril 2011 à 14:38:30

Bon, quelqu'un m'a donner l'idée d'utiliser un fichier temporaire ...
Donc c'est ce que je vais faire, seulement, est-il possible d'écrire dans un fichier, à la suite du texte déjà écrit ?
Parce que quand on instancie un Buffered avec le fichier déjà rempli et qu'on fait un writeObject ... ça écrase ce qui y est ...
Comment y remédier ?

Merci.
PS
Sinon ça m'obligerait de lire, désérialiser, puis réensérializer le tout ...
Ce serait beaucoup trop lourd ...

EDIT

Et c'est très facile en PHP, et comme JAVA est beaucoup plus puissant que PHP ...
  • Partager sur Facebook
  • Partager sur Twitter
15 avril 2011 à 14:50:46

Je comprends vraiment pas ton problème...

Citation : Dominique0796


Justement pas, il me faut un tableau comme ceci :
{{col1, col2, col3},{item_a1, item_a2, item_a3},{item_b1, item_b2, item_b3}}


Pour faire ce truc là une ArrayList d'ArrayList suffit amplement ! Pas besoin de passer par un fichier temporaire ou quoi que ce soit...

Donc j'ai ptet' rien compris à ce que tu veux faire mais pour faire ce que j'ai cité voilà ce qu'on peut faire :
import java.util.*;
public class Test
{
	public static void main(String... args)
	{
		ArrayList<ArrayList<String>> tableau = new ArrayList<ArrayList<String>>(4);
		tableau.add(creeListe("col1","col2","col3"));
		tableau.add(creeListe("item_a1","item_a2","item_a3"));
		tableau.add(creeListe("item_b1","item_b2","item_b3"));
		tableau.add(creeListe("item_c1","item_c2","item_c3"));
		for(List<String> ligne : tableau)
		{
			System.out.println("Nouvelle ligne : ");
			for(String cellule : ligne)
				System.out.println(cellule+";");
		}
	}
	
	private static ArrayList<String> creeListe(String... s)
	{
		ArrayList<String> temp = new ArrayList<String>(3);
		temp.add(s[0]);
		temp.add(s[1]);
		temp.add(s[2]);
		return temp;
	} 
}
  • Partager sur Facebook
  • Partager sur Twitter
15 avril 2011 à 14:56:39

String[] Lines //contient toute les lignes
for(Lines){ // on parcourt chaques lignes
  // Ce qui suit est le traitement des données
  // on split les données
  while(conditions){
    // On traite chaque résultat un par un
     ARresult.add(tmp); // ARresult est un  ArrayList<String>. tmp contient les resultats
  }
  
  ARfinal.add(ARresult); // On ajoute les résultat de cette lignes à ARfinal qui est de type ArrayList<ArrayList>

 /*
*  Et là, important ! Il faut vider ARresult (pour la boucle suivante), sans que ça joue sur ARfinal !!
*/

}
return ARfinal



Ton code ne peu pas être adapté à ce scénario ...
Ou enfin, tu me donne une idée ...
Mais oui !

Tu fait une autre fonction addItem() par exemple, tu lui passe en param ArrayList, puis là tu peu vider sans pb je crois ...
J'essaye ça :
Merci !

EDIT

Tonnerre, ça marche pas non plus ...
mon amis avait raison, une collection lie seulement et ne retient pas ...
Et comme je ne peu pas calculer les dimensions de mon array ...

Le code :

public ArrayList get(){

String[] tmp={"aaa", "bbb", "ccc", "ddd","eee","fff","ggg"};
		String[] tmp2={"aaaaa", "bbbbb", "ccccc", "ddddd","eeeee","fffff","ggggg"};
		for(String text: tmp){
			ARresult.add(text);
		}
		addItemToARfinal(ARresult);
		ARresult.clear();
		
		for(String text: tmp2){
			ARresult.add(text);
		}
		addItemToARfinal(ARresult);
		ARresult.clear();
		
				return ARfinal;
	}
	
	private void addItemToARfinal(ArrayList<String> element){
		this.ARfinal.add(element);
	}


EDIT EDIT

Eh mais je sais !
Quand j'ai finit de remplir ARresult, je le ttansforme en array !
Mais oui !
J'essaye ça ...

Ouf !
Ca marche ce coup ci !

public ArrayList get(){
		
		
		String[] tmp={"aaa", "bbb", "ccc", "ddd","eee","fff","ggg"};
		String[] tmp2={"aaaaa", "bbbbb", "ccccc", "ddddd","eeeee","fffff","ggggg"};
		for(String text: tmp){
			ARresult.add(text);
		}
		
		array = castInArray(ARresult);
		
		ARfinal.add(array);
		ARresult.clear();
		
		for(String text: tmp2){
			ARresult.add(text);
		}
		array = castInArray(ARresult);
		
		ARfinal.add(array);
		
		
				return ARfinal;
	}
	
	private String[] castInArray(ArrayList<String> ar){
		int nb = ar.size();
		String[] array = new String[nb];
		int i = 0;
		for(String text: ar){
			array[i]=text;
			i++;
		}
		return array;
	}


Merci quand même ;)
  • Partager sur Facebook
  • Partager sur Twitter
20 avril 2011 à 2:33:32

Ha ouais pas bête, j'y avais pas pensé à celle là. =D

Mais moi ce que j'aurai fait c'est :

1) Transformer tes tableaux en ArrayList
2) Ajouter tout les éléments de arResult dans arFinal : arFinal.addAll(arResult);
//Ajoute tous les éléments de arResult dans arFinal.
3) Si tu veux les supprimer : arFinal.removeAll(arResult);
//Retire tout les éléments de arResult dans arFinal

Et plus besoin d'une arraylist d'arraylist, franchement je trouves que tu te compliques la vie!

Pour les fichiers tu peux sérialiser ton ArrayList, pour ne pas écraser les données dans le fichier par contre je ne sais plus ce qu'il faut faire. =/

Mais bon un peu de recherche et on trouve facilement ça.


  • Partager sur Facebook
  • Partager sur Twitter
20 avril 2011 à 9:21:17

Citation

Pour les fichiers tu peux sérialiser ton ArrayList, pour ne pas écraser les données dans le fichier par contre je ne sais plus ce qu'il faut faire. =/


Hé là, pas de fichier, sans quoi ça va alourdir considérablement !
Là, ça fait 250 000 cellules par sec ...
C'est pas trop mal, mais si on comment à utiliser les fichier ...

Citation

Et plus besoin d'une arraylist d'arraylist, franchement je trouves que tu te compliques la vie!



?!
Justement, c'est mon but !
Et oui, c'est pour faire à peu près la même chose que pour les tableau ...
Parce que toute les cellule débitée à la suite, ça c'est simple à faire ...
Je pense qu'il y a quelque chose que je n'ai pas saisi ...

EDIT EDIT

Oups pardon, je me croyais encore dans ce topic ! :p
  • Partager sur Facebook
  • Partager sur Twitter
17 novembre 2018 à 8:00:40

Pour faire simple, tu peux garder ton premier programme et au lieu d'utiliser ceci : ARresult.clear(); , tu n'as qu'à faire ARresult = new ArrayList<String>();

ça marche très bien et c'est simple!

  • Partager sur Facebook
  • Partager sur Twitter
Nathan Chedjoun
17 novembre 2018 à 8:55:03

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. 

  • Partager sur Facebook
  • Partager sur Twitter