[java]comment compter les cases identique d'un tableau ?

comment compter les cases identique d'un tableau ? [java] - Java - Programmation

Marsh Posté le 28-09-2015 à 20:28:32    

bonsoir,
 
je seche totalement sur mon probleme.
 
je cherche a réaliser une analyse d'un tableau contenant des adresse par rue.
 
le tableau contient des adresses , du type Mr truc, 23 rue de la gare , ou mme michu, 18b avenue de la place.
 
avec un indexOf il n'y a pas de probleme je récupère les rue que je veux
 
je peut même réaliser une liste de toutes les rue ou avenue.
 
Mais je voudrais que ca donne :
 
rue de la gare : 23 logements
avenue de la place : 11 logements
place jean jaures : 5 logements
 
avez vous des idée simple pour le faire sans passer par des map ou autre truc complexe ?
 
Merci


---------------
L'urbex : faire découvrir le patrimoine oublié / Mes albums urbex : https://www.flickr.com/photos/14695 [...] 5272741566 et https://www.flickr.com/photos/20070 [...] 0316987281
Reply

Marsh Posté le 28-09-2015 à 20:28:32   

Reply

Marsh Posté le 28-09-2015 à 21:39:30    

le debut du code
 
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package boitem;
 
import java.util.Arrays;
 
/**
 *
 * @author CityHunter
 */
public class Boitem {
static String[] fourniseur;
static String resultat;
static String recherche;
static String[] tableau1;
static int compteur;
static int nbClient;
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
                String[] tableau1;
                tableau1=new String[10] ;  
                tableau1[0]="14, rue des tilleules";
                tableau1[1]="11, avenue de la gare";
                tableau1[2]="59, avenue de la gare";
                tableau1[3]="9, rue des tilleules";
                tableau1[4]="9, rue des tilleules";
                tableau1[5]="2,rue de la gare";
                tableau1[6]="21, place jean jaures";
                tableau1[7]="8, place jean jaures";
                tableau1[8]="1, place jean jaures";
                tableau1[9]="5, rue des tilleules";
         
 
                 
        //*crée un tableau fournisseur contenant que les fourniseurs
 
                String[] adresses;
                adresses= new String[10];
                 
                    for(int i=0;i<tableau1.length;i++)
                        {  
 
               //le tableau nomfourniseur en entier est remplie avec la recherche (substring) en entier de tableau1 [i] en ne prenant que les@xxxx (indexOf)//
                     
               adresses[i]=tableau1[i].substring(tableau1[i].indexOf("," )+1);
                 
               
                        }
                   
               String resultat[];  
               String recherche;
               for(int i=0;i<adresses.length-2;i++)
               {
                   for(int j=i+1;j<adresses.length-1;j++)
                   {
                        if (adresses[i].compareTo(adresses[j])==1)
                        {
                            recherche=adresses[i];
                            adresses[i]=adresses[j];
                            adresses[j]=recherche;  
                 
                compteur++;
                        }
                        else
                        {
                        nbClient=compteur++;
                        }
                   }    
               }    
       System.out.println("le adresses des clients" );        
      System.out.println(Arrays.toString(adresses));        
                     
                     
                             
                   }
}


---------------
L'urbex : faire découvrir le patrimoine oublié / Mes albums urbex : https://www.flickr.com/photos/14695 [...] 5272741566 et https://www.flickr.com/photos/20070 [...] 0316987281
Reply

Marsh Posté le 29-09-2015 à 09:24:18    

Bonjour !
 
Je ne suis pas d'accord avec vous sur la complexité d'utilisation d'une map, qui présente en plus l'avantage de ne parcourir qu'une seule fois la liste de toutes les adresses. Vous n'aurez besoin que de peu de fonctionnalités de ce conteneur dans votre cas.
 
Cela me paraît être le conteneur le plus adapté, avec un algorithme simple. Ssi vous voulez faire autrement, en n'utilisant que des tableaux, vous allez vous rendre compte que l'algorithme se complique assez vite, et que le temps de parcours n'est plus linéaire et augmente très vite lui aussi !
 
J'ai bien conscience de répondre (largement) à côté de votre réponse, mais je ne suis pas certain qu'il soit possible de trouver une réponse simple sans utiliser un conteneur qui est, selon moi, très adapté, voire le plus adapté à la résolution du problème.
 
Bonne continuation !

Reply

Marsh Posté le 29-09-2015 à 15:27:45    

Oui, une map (que j'appelle en perl un hash), c'est la structure naturelle pour ce genre de décompte.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-09-2015 à 21:04:41    

Code :
  1. package boitem;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.HashSet;
  5. import java.util.List;
  6. import java.util.Set;
  7. public class Boitem {
  8.    public static void main(String[] args) {
  9.       String[] tab;
  10.       tab = new String[10];
  11.       tab[0] = "14, rue des tilleules";
  12.       tab[1] = "11, avenue de la gare";
  13.       tab[2] = "59, avenue de la gare";
  14.       tab[3] = "9, rue des tilleules";
  15.       tab[4] = "9, rue des tilleules";
  16.       tab[5] = "2,rue de la gare";
  17.       tab[6] = "21, place jean jaures";
  18.       tab[7] = "8, place jean jaures";
  19.       tab[8] = "1, place jean jaures";
  20.       tab[9] = "5, rue des tilleules";
  21.       List<String> liste = new ArrayList<>();
  22.       for (String s : tab) {
  23.          String[] adresse = s.split("\\s*,\\s*" );
  24.          liste.add(adresse[1]);
  25.       }
  26.       Set<String> unique = new HashSet<>(liste);
  27.       for (String cle : unique) {
  28.          System.out.println(cle + ": " + Collections.frequency(liste, cle));
  29.       }
  30.    }
  31. }


OUTPUT :
avenue de la gare: 2
rue de la gare: 1
rue des tilleules: 4
place jean jaures: 3

Reply

Marsh Posté le 30-09-2015 à 08:45:38    

One liner Java 8 avec Collectors.groupingBy() :
 

Code :
  1. List<String> addresses = Arrays.asList(
  2.    "14, rue des tilleules", "11, avenue de la gare", "59, avenue de la gare", "9, rue des tilleules",
  3.    "9, rue des tilleules", "2,rue de la gare", "21, place jean jaures", "8, place jean jaures",
  4.    "1, place jean jaures", "5, rue des tilleules" );
  5.  
  6. Map<String, Long> occurrences = addresses.stream().collect(
  7.    Collectors.groupingBy(address -> address.split("," )[1], Collectors.counting()));
  8.  
  9. occurrences.forEach((street, count) -> System.out.println(street + ": " + count));


 
C'est quand même moins moche que les tableaux et foreach.

Reply

Marsh Posté le 04-10-2015 à 22:19:03    

bonsoir , désoler j'etait tres oqp ces jours ci je vous remerci pour la solution, qui a débloquer mon probleme :)
 
effectivement passer par une liste est tres simple, je n'y avais pas penser :) merci a tous :)


Message édité par saebalyon le 04-10-2015 à 22:19:31

---------------
L'urbex : faire découvrir le patrimoine oublié / Mes albums urbex : https://www.flickr.com/photos/14695 [...] 5272741566 et https://www.flickr.com/photos/20070 [...] 0316987281
Reply

Marsh Posté le 06-10-2015 à 13:27:47    

Bonjour,
Je connais pas java comme on entend connaître un langage, mais j'y ai touché, j'en connais un poil pour dire que :
Si non, en pseudo-langage :
 
je reformule ainsi, contruire une liste de compteur d'occurence.
 
Donc on devrait avoir un type : ou une structure, une classe, avec : une occurence et un compteure.
 
Et contruire la liste en parcourant le tableau.
  si l'occurence n'existe pas, on l'ajoute on initialise à 1 le compteur,
 si non on incrémente le compteur de l'occurence.
fin loop.

Reply

Marsh Posté le 06-10-2015 à 14:00:12    

> Et contruire la liste en parcourant le tableau.  
 
C'est pour ça qu'on a dit d'utiliser un tableau associatif: pour éviter de parcourir la liste à chaque fois pour tester si l’occurrence existe dans la liste.
 
A+,


Message édité par gilou le 06-10-2015 à 14:01:26

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-10-2015 à 14:19:54    

Bonjour Gilou.
 
Tu pourais, m'expliquer l'astuce là, parce que si j'évite de parcourir un gestionnaire de donné pour savoir si une donnée existe dans le gestionnaire, je me passrais de l'option O2 de gcc. Ou autre. C'est quoi un tableau associatif ? Merci.
 
(A moins de trier, indexer, sommer les index, trier les index)

Reply

Marsh Posté le 06-10-2015 à 14:19:54   

Reply

Marsh Posté le 06-10-2015 à 14:26:48    

Si non en réccurcif, vous procèderiez comment.
C'est pas une idée ?

Reply

Marsh Posté le 07-10-2015 à 14:13:09    

Un tableau associatif, ou hash, ou dictionnaire, c'est un tableau donc chaque élément est un couple (clé, donnée) la clé ayant une valeur unique et sert de valeur d'index pour accéder à la valeur associée.
Dans ce cas précis, tu utilises comme clé la ligne elle même, et comme donnée un compteur.
Quand tu lis une ligne, tu cherche la valeur du tableau associatif avec pour clé cette ligne.
Soit il y en a pas, et tu en crées une avec pour valeur de compteur 1,  
Soit il y en a, et tu incrémentes la valeur du compteur de 1
 
Plein de langages supportent directement ou avec un module standard cette structure de donnée basique (Perl Python C++ etc)
 
A+,


Message édité par gilou le 07-10-2015 à 14:13:52

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-10-2015 à 18:38:06    


Ah woais, les tables de hashage j'appelle ça.
J'ai raté le cours peut être ou comme j'ai jamais jeter un oeuil à la structure j'y pensais pas.
 
Et donc là, ce serait adapté \;
 
Kool!
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed