Java, ArrayList

Fermé
gaby10 Messages postés 445 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 3 février 2013 - 13 déc. 2011 à 17:55
gaby10 Messages postés 445 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 3 février 2013 - 15 déc. 2011 à 17:32
Bonjour,

Je vous explique mon probleme.

J'ai un tableau de taille NxN contenant des valeurs aleatoires de 0 a 9. Le but est de determiner le plus court chemin de matrice[0][0] a matrice[N-1][N-1].
Au depart j'ai pense mettre toutes mes valeurs dans un graphe malheureusement sa ne marche correcte puisque les noeuds peuvent avec les memes valeurs. Alors j'ai pense a une ArrayList.

 ArrayList<String> myArray= new ArrayList<String>(number*number);
for(i=0;i<=number-1;i++){
                for(j=0;j<=number-1;j++){

                    
                    myArray.add(myTab[i][j], "Node"+tmp);

                    myArray.clear();

                    tmp = tmp + 1;
                    
                    
                }


mais il me retourne une Exception
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 5, Size: 0

Quelles solutions ne donnez vous?

A voir également:

3 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
13 déc. 2011 à 18:22
les noeuds peuvent avec les memes valeurs ???

Pourquoi tu fais myArray.clear(); à chaque fois ? C'est ça qui te coince !
De plus que penserais-tu de faire une ArrayList<ArrayList<String>> ?
0
gaby10 Messages postés 445 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 3 février 2013 58
13 déc. 2011 à 18:34
ArrayList<ArrayList<String>> ?
Et comment pourrais l'implementer
Je vois l'approche un arrayList dynamique?
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
13 déc. 2011 à 18:50
ArrayList<ArrayList<String>> myArray = new ArrayList<ArrayList<String>>(myTab.length);

for (int i=0; i<myTab.length; i++)
{
	ArrayList<String> ligne = new ArrayList<String>(myTab[i].length);
	
	for(int j=0; j<myTab[i].length; j++)
		ligne.add(myTab[i][j]);
	
	myArray.add(ligne);
}

Ensuite au lieu de faire myTab[i][j], tu fais myArray.get(i).get(j), mais j'avoue que l'intérêt me paraît limité, qu'est-ce que tu gagnes à représenter tes données comme cela plutôt qu'en tableau ?
0
gaby10 Messages postés 445 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 3 février 2013 58
13 déc. 2011 à 19:01
Si si en tableau c'est fait disons dans une matrice NxN. La difficulte ici est de pouvoir parcourir toute la matrice et determiner en fonction des donnees du tableau , le plus court chemin de l'index matrice[0][0] a la fin matrice[N-1][N-1]. A priori y a pas d'algorithme du genre Djistra pour une matrice a moins de transformer la martice en graphe mais pr des raisons citees plus haut. Les noeuds du graphe doivent etre de valeur differentes donc cette solution est proscrite. je pensais a mettre un ArrayList question d'avoir List(index,[i][j]) et faire un calcul dessus
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 13/12/2011 à 19:17
Le truc c'est qu'il n'y a aucune différence entre ton tableau myTab, et la liste myArray, certes elles ne sont pas structurellement identiques, mais il n'y a pas d'informations supplémentaires en plus.
Tout ce que tu pourras calculer sur myArray, tu peux le calculer directement sur myTab.
"Y a pas d'algorithme du genre Djistra pour une matrice", ça dépend, c'est quoi que tu appelles "matrice" ici ? À quoi correspondent les valeurs de ton tableau/matrice ? Est-ce que c'est la matrice d'adjacence d'un graphe à n noeuds (le poids des n² aretes) ? Ou alors le poids de chacun des n² noeuds du graphe (avec 2n(n-1) aretes) ? Si on peut se ramener à un graphe on peut utiliser Dijkstra sans problème (à condition que les poids soient positifs) !
0
gaby10 Messages postés 445 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 3 février 2013 58
13 déc. 2011 à 19:41
Bien voici un exemple
1    0    4    
8    7    8    
5    5    4    

J'ai cette tableau de taille 9
Mon algorithme doit me calculer et me retourner le plus court chemin de 1 ([0][0] ) a 4 ([8][8]) et donc
(0,0)
(0,1)
(2,2)
(3,2)
(3,3)
dans le cas actuel. C'est donc cet alogorithme ke je cherche a implementer.
0
gaby10 Messages postés 445 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 3 février 2013 58
13 déc. 2011 à 19:45
i'idee est de mettre les valeurs dans une ArrayList du genre
myArray("Node_"+i+","+j,myTab[i][j]) 
et ensuite les envoyer dans un graphe
myGraph.addNode("Node_"+i+","+j);

Pour pouvoir utiliser Djistra
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
15 déc. 2011 à 14:23
Il faut que tu apprennes à découper ton code en partie indépendante autant que tu le peux, par exemple ici tu fais la génération aléatoire de la matrice, la création du fichier, et la création du graphe, tout ça dans la même méthode alors que les traitements sont très fortement distincts.

Pour la partie graphe en elle même, j'ai mis quelques commentaires pour t'y retrouver, mais c'est assez simple à comprendre je pense.

Remarque : j'ai supprimé, ton ArrayList car il ne sert à rien, le tableau suffit.

import org.graphstream.graph.Edge;
import org.graphstream.graph.Node;
import org.graphstream.graph.implementations.SingleGraph;

import java.io.FileWriter;
import java.io.IOException;

import java.util.Random;

public class FileManage 
{
    private final SingleGraph myGraph;
    
    private final int[][] myTab;
    
    public FileManage(int dim,String fileName)
    {
        myTab = createMatrix(dim,0,9);
        saveMatrix(dim,myTab,fileName);
        myGraph = createGraph(dim,myTab,"My Graph");
        myGraph.display(false);
    }
        
    public static int [][] createMatrix(int dim, int minValue, int maxValue)
    {
        int[][] myTab= new int[dim][dim];
         
        Random rd = new Random();
        
        for (int i=0; i<dim; i++)
        for (int j=0; j<dim; j++)
            myTab[i][j] = rd.nextInt(maxValue+1-minValue)+minValue;

        return myTab;
    }
         
    public static boolean saveMatrix(int dim, int[][] mat, String fileName)
    {
        try
        {
            String endl = System.getProperty("line.separator");
            
            FileWriter filew = new FileWriter(fileName);

            for(int i=0; i<dim; i++)
            {
                for(int j=0; j<dim; j++)
                    filew.write(mat[i][j]+"\t");
                
                filew.write(endl);
            }
            
            filew.close();
            
            return true;
        }
        catch (IOException e)
        {
            System.err.println(e);
            return false;
        }
    }
    
    private static String ID(int i,int j)
    {
        return "("+i+","+j+")";
    }
    
    private static String ID(int i1,int j1,int i2,int j2)
    {
        return ID(i1,j1)+"-"+ID(i2,j2);
    }
    
    public static SingleGraph createGraph(int dim, int[][] mat, String graphName)
    {
        SingleGraph g = new SingleGraph(graphName);
        
        // création des noeuds
        //--------------------
        
        for (int i=0; i<dim; i++)
        for (int j=0; j<dim; j++)
        {
            String id = ID(i,j);
            Node n = g.addNode(id);
            
            n.addAttribute("xyz",j,-i,0); // la position du noeud dans l'espace
            n.addAttribute("val",mat[i][j]); // le poids du noeud
            n.addAttribute("label",id+"["+mat[i][j]+"]"); // l'étiquette du noeud pour l'affichage
            
            // un noeud normal en noir
            n.setAttribute("ui.style","size:8px; fill-color:black; text-color:black; text-size:12px;");
        }

        // le noeud de départ en vert
        g.getNode(ID(0,0)).setAttribute("ui.style","size:10px; fill-color:green; text-color:green; text-size:12px;");
        
        // le noeud d'arrivée en rouge
        g.getNode(ID(dim-1,dim-1)).setAttribute("ui.style","size:10px; fill-color:red; text-color:red; text-size:12px;");
        
        // création des arêtes
        //--------------------
        
        for (int i=0; i<dim; i++)
        for (int j=0; j<dim; j++)
        {
            // arete horizontale
            if (j<dim-1)
            {                
                Edge e = g.addEdge(ID(i,j,i,j+1),ID(i,j),ID(i,j+1));
                e.setAttribute("ui.style","size:1px; fill-color:black;");
            }
            
            // arete verticale
            if (i<dim-1)
            {
                Edge e = g.addEdge(ID(i,j,i+1,j),ID(i,j),ID(i+1,j));
                e.setAttribute("ui.style","size:1px; fill-color:black;");
            }
        }
        
        return g;
    }
    
    public static void main(String...args)
    {
        new FileManage(5,"C:\\fichier.txt");
    }
}
0
gaby10 Messages postés 445 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 3 février 2013 58
15 déc. 2011 à 17:32
Merci KX,
Je teste le code tout de suite et te reporte.
0