Fusionner 2 tableaux

Fermé
Utilisateur anonyme - 11 sept. 2011 à 21:15
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 12 sept. 2011 à 12:17
Bonjour,
SVP, aidez-moi, j'ai créée 3 tableaux en mémoire en utilisant le langage java (le tableau se, re2 et re1)
String se[][]=new String[5000][6];
String re2[][]=new String[5000][6];
String re1[][]=new String[5000][6];
je voudrais savoir comment je peux fusionner les lignes des tableaux (se et re2) pour les afficher dans un seul tableau re1

voila le code que j'ai fait mais ca n'a pas marché
//une méthode qui permet de remplir le tableau re1
private int fich (String se[][],int n,String re2[][],int m2,String se2[][],int n1,String re[][],int m, String re1[][]) {
int j=0;
for(int l=0;l<n;l++){
for(int i=0;i<m;i++){

if(se[l][4].equals(re2[i][3]) && se[l][2].equals(re2[i][2]) && se[l][5].equals(re2[i][5]) ){
re1[j][0]=se[l][0] ;
re1[j][1]=re2[i][1];
re1[j][2]=re2[i][2];
re1[j][3]=re2[i][3];
re1[j][4]=se[l][4];
re1[j][5]=re2[i][5];
j++;}
}
}
for(int l=0;l<n;l++){
for(int i=0;i<m;i++){

if(se2[l][4].equals(re[i][3]) && se[l][2].equals(re[i][2]) && se[l][5].equals(re[i][5]) ){
re1[j][0]=se2[l][0];
re1[j][1]=re[i][1];
re1[j][2]=se2[i][2];
re1[j][3]=re[i][3];
re1[j][4]=se2[l][4];
re1[j][5]=re[i][5];
j++;}
}
}


return j;
}
A voir également:

4 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
11 sept. 2011 à 21:53
Quand tu as 5000 valeurs, il faut virer les tableaux et regarder les Collection.

Pour résoudre tout tes problèmes construit toi une bonne fois pour toutes des classes, par exemple R et S (que tu créeras à partir de tes lignes R et S) dont tu construiras tes objets à partir des lignes de ton fichier. Et T les objets qui seront issus de la fusion de deux objets R et S compatibles.

Exemple :

public class R
{
    public final String passerelle, partenaire, destination...

    public R(String ligneFichier)
    {
        // initialisation de tous les champs à partir de la ligne du fichier
        // facile à faire avec Scanner
    }
}

Comme ça tu oublies tes tableaux et tu utilises des Collection (éventuellement triées pour être plus efficace)

Tu auras alors un code comme ceci :

private boolean compatible(R r, S s)
{
    return r.passerelle.equals(s.passerelle) && ...
}

public void fich(Collection<R> cr, Collection<S> cs, Collection<T> ct)
{
    for (R r : cr) // la double boucle est lourde d'un point de vue complexité
    for (S s : cs) // si tu peux trier tes valeurs tu y gagneras en rapidité
        if (compatible(r,s))
            ct.add(new T(r,s));
}

Si tu fais ton code orienté objet, tu vas rapidement résoudre bon nombre de tes problèmes, là tu perds tout l'intérêt d'utiliser le langage Java !
0
Utilisateur anonyme
12 sept. 2011 à 01:59
Salut, je n'ai pas bien compris ce que vous m'avez écrit,vous pouvez m'écrire svp un code qui me permet de changer le mien svp?
0
choubaka Messages postés 39409 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 24 décembre 2024 2 104
12 sept. 2011 à 08:35
Bonjour

Ce qu'explique KX, c'est l'utilisation des classes et interfaces du package java.util

http://download.oracle.com/javase/1.4.2/docs/api/java/util/package-summary.html

Certaines classes permettent de gérer des tableaux de données de manière dynamique. comme des ArrayList par exemple ou les collections. Ce sont des structures de données.

Pas mal d'exemples ici

http://www.java-examples.com/java-collections-and-data-structures-(-java.util-package-)

0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
12 sept. 2011 à 12:17
Voici un code d'exemple, à toi de remanier (je me répète) les expressions régulières pour bien lire ton fichier, mais vu qu'ici ta question porte sur la fusion des tableaux, on va dire qu'on peut passer outre ce problème...

Un programmeur averti remarquera tout de suite qu'il est beaucoup plus simple à comprendre, à modifier, et pire : à écrire (!) que ton code avec des indices de tableaux partout, où l'on ne sait plus ce qui correspond à quoi ! Et en plus : c'est plus efficace...

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.regex.MatchResult;

class R
{
	public final String
		machineSource,
		passerelle,
		identifiant,
		dateEnvoi,
		nomFichier;
	
	public R(String ligneFichier)
	{
		Scanner sc = new Scanner(ligneFichier);
		sc.findInLine("RSF (\\w+) (?:\\w+) ..."); // TODO
		MatchResult mr = sc.match();
		
		machineSource = mr.group(0);
		passerelle = mr.group(1);
		identifiant = mr.group(2);
		dateEnvoi = mr.group(3);
		nomFichier = mr.group(4);
		
		sc.close();
	}
}

class S
{
	public final String
		machineDestination,
		passerelle,
		identifiant,
		dateReception,
		nomFichier;
	
	public S(String ligneFichier)
	{
		Scanner sc = new Scanner(ligneFichier);
		sc.findInLine("SRF (?:\\w+) (\\w+) ..."); // TODO
		MatchResult mr = sc.match();
		
		passerelle = mr.group(0);
		machineDestination = mr.group(1);
		identifiant = mr.group(2);
		dateReception = mr.group(3);
		nomFichier = mr.group(4);
		
		sc.close();
	}
}

class T
{
	public final String
		machineSource,
		machineDestination,
		dateEnvoi,
		dateReception,
		identifiant,
		nomFichier;
	
	public static boolean compatibles(R r, S s)
	{
		return r.dateEnvoi.equals(s.dateReception)
			&& r.identifiant.equals(s.identifiant)
			&& r.nomFichier.equals(s.nomFichier);
	}
	
	public T(R r, S s)
	{
		machineSource=r.machineSource;
		machineDestination=s.machineDestination;
		dateEnvoi=r.dateEnvoi;
		dateReception=s.dateReception;
		identifiant=r.identifiant;
		nomFichier=r.nomFichier;
	}
}

public class Test
{
	public static final File REP = new File("C:\\CFT");
	
	public static void lireFichier(File fichier, Collection<R> cr, Collection<S> cs) throws FileNotFoundException
	{
		Scanner sc = new Scanner(fichier);
		while (sc.hasNextLine())
		{
			String ligne = sc.nextLine();
			if (ligne.startsWith("RSF"))
				cr.add(new R(ligne));
			else if (ligne.startsWith("SRF"))
				cs.add(new S(ligne));
		}
		sc.close();
	}
	
	public static void fusionner(Collection<R> cr, Collection<S> cs, Collection<T> ct)
	{
		for (R r : cr)
		for (S s : cs)
			if (T.compatibles(r, s))
				ct.add(new T(r,s));
	}
	
	public static void main(String...args)
	{
		Collection<R> cr = new LinkedList<R>();
		Collection<S> cs = new LinkedList<S>();
		
		for (File f : REP.listFiles())
		{
			try 
			{
				lireFichier(f,cr,cs);
			}
			catch (FileNotFoundException e) 
			{
				System.err.println(e);
			}
		}
		
		Collection<T> ct = new LinkedList<T>();
		
		fusionner(cr,cs,ct);
		
		for (T t : ct)
			System.out.println(t); // TODO : redéfinir toString dans T
	}
}
0