IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

probleme de recherche dans le tableau est tri


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 113
    Par défaut probleme de recherche dans le tableau est tri
    voila lors d'un autre sujet ,j'ai pu avancer ,maintenant j'ai un autre problème
    sur le resultat ..j'aimerai savoir combien il y a de numéro identique

    cette routine que j'ai trouver ici ne semble pas fonctionner
    elle recherche les nombre identique est devrais les additionner ,mais il me semble quel ne le fais pas
    j'ai mis dans le fichier text des chiffre pour voir si cela fonctionner...
    plus bas le programme entier pour ceux qui s interesse
    donc ce qui me intéresse c'est les chiffre qui sont dans position, combien il se repete ..
    merci de votre aide





    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    for(int ii=0; ii<tableauIndiceTrouve.length; ii++){
     
    	        System.out.println("The number " + tableauIndiceTrouve[ii]/5 + " is repeted " + times[ii] + " times");
    	    }
     
    	}
     
    	public static int recherche(int maValeur, int[] tab, int depart) {
    		int monIndice = -1;
    		for (int i = depart; monIndice == -1 && i < tab.length; i++) {
     
    			if (maValeur == tab[i]) {
    				// System.out.println(i);
    				monIndice = i;
     
    			}
    		}
    		return monIndice;
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    package file;
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.HashMap;
    import java.util.Map;
    public class files {
     
    	/**
             * Constructeur
             */
    	public files() {
    		int[] tableau = null; 
    		//int[] tableau2=null; 
    		int tableau3[]=new int[1000];
    		int tableau4[]=new int[1000];
    		int j=0;
    		int x=0;
     
    		try (BufferedReader b = new BufferedReader(new FileReader(new File("d:/taxe.txt")))) {
    			String line;
    			// Lecture du fichier ligne par ligne. Cette boucle se termine
    			// quand la méthode retourne la valeur null.
    			while ((line = b.readLine()) != null) {
     
    				String[] args = line.split("\\s+");
     
    				int[] lecture = new int[args.length - 1]; // on crée un tableau
    															// temporaire pour
    															// la lecture
     
    				for (int i = 1; i < args.length; i++) {
     
    					lecture[i - 1] = Integer.parseInt(args[i]);
     
    				}
     
    				if (tableau == null) {
    					tableau = lecture;
    				} else { // on va créer un tableau temporaire pour copier les 2
    							// autres dedans
    					int[] temp = new int[tableau.length + lecture.length];
    					System.arraycopy(tableau, 0, temp, 0, tableau.length); // copie tableau dans temp 
    					System.arraycopy(lecture, 0, temp, tableau.length, lecture.length); // copie lecture dans temp (même remarque que ligne précédente)
    					tableau = temp;
    				}
     
    			}
     
     
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
     
    		// affichage
     
    		System.out.println("Valeurs dans tableau : ");
    		for (int i = 0; i < tableau.length; i++) {
    			System.out.print(tableau[i]);
    			if (((i + 1) % 5) == 0) {
    				System.out.println();
    			} else {
    				System.out.print(" ");
    			}
    		}
     
    		int indiceTableau = 0;
    		int[] tableauIndiceCherche = new int[tableau.length];
    		int[] tableauIndiceTrouve = new int[tableau.length];
    		for (int i = 0; i < tableau.length - 1; i++) {
     
    			int indiceTrouve = recherche(tableau[i], tableau, i + 1);
    			if (indiceTrouve >= 0) {
    				// par exemple
    				tableauIndiceCherche[indiceTableau] = i;
    				tableauIndiceTrouve[indiceTableau] = indiceTrouve;
     
    				indiceTableau++; // on passe à la case suivante
     
    			}
     
    		}
     
    		// afichage des résultats
    		for(int i=0; i<indiceTableau; i++) {
    			System.out.println("La valeur tableau[" + tableauIndiceCherche[i]+"]="+tableau[tableauIndiceCherche[i]]+" a été trouvée en double en position " + (tableauIndiceTrouve[i]/5) + ": tableau["+tableauIndiceTrouve[i]+"]="+tableau[tableauIndiceTrouve[i]]);
    			//System.out.println(tableau[tableauIndiceTrouve[i]]);
     
    			//tableau2[i]=tableau[tableauIndiceTrouve[i]];
    		}
    		Arrays.sort(tableauIndiceTrouve);
     
    		int times[] = new int[tableauIndiceTrouve.length];
     
    	    for(int i=0; i<tableauIndiceTrouve.length; i++){
    	        int number = tableauIndiceTrouve[i];
    	        for(int ii=0; ii<tableauIndiceTrouve.length; ii++){
    	            if(number == tableauIndiceTrouve[ii]/2){
    	                times[i]++;
     
    	            }
    	        }     
    	    }
    	    for(int ii=0; ii<tableauIndiceTrouve.length; ii++){
     
    	        System.out.println("The number " + tableauIndiceTrouve[ii]/5 + " is repeted " + times[ii] + " times");
    	    }
     
    	}
     
    	public static int recherche(int maValeur, int[] tab, int depart) {
    		int monIndice = -1;
    		for (int i = depart; monIndice == -1 && i < tab.length; i++) {
     
    			if (maValeur == tab[i]) {
    				// System.out.println(i);
    				monIndice = i;
     
    			}
    		}
    		return monIndice;
    	}
     
    	/**
             * MAIN
             */
    	public static void main(String[] args) {
    		// On lance notre lire fichier
    		new files();
    	}
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si je comprends bien, tu cherches à compter le nombre de fois qu'on trouve un nombre qui se répète.

    Ta boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Arrays.sort(tableauIndiceTrouve);
     
    		int times[] = new int[tableauIndiceTrouve.length];
    for(int i=0; i<tableauIndiceTrouve.length; i++){
    	        int number = tableauIndiceTrouve[i];
    	        for(int ii=0; ii<tableauIndiceTrouve.length; ii++){
    	            if(number == tableauIndiceTrouve[ii]/2){
    	                times[i]++;
     
    	            }
    	        }     
    	    }
    n'a strictement aucun sens logique par rapport aux tableaux en entrée (le tableau de valeurs, et le 2 tableaux où sont stockés les résultats de recherche de doublon). Et aucun sens par rapport au comptage des occurrences (c'est quoi cette division par 2 ?).

    Reprenons :
    • tableau : les données en entrée. Par exemple, 1, 2, 3, 4, 5, 2, 3, 6, 7, 8, 2, 9
    • tableauIndiceCherche: un tableau dans lequel on stocke les indices (ou index en anglais) des valeurs trouvées en doublon (en réalité, avec un valeur identique dans la suite du tableau), donc, pour l'exemple ci-dessus : 1 (valeur 2, située à l'index 1 dans tableau), 2(valeur 3), 5(deuxième valeur 2)
    • tableauIndexCherche : un tableau dans lequel on stocke l'indice de valeur identique à celle du même indice dans tableauIndiceTrouve. Donc, pour l'exemple ci-dessus :
      5 (la valeur tableau[ tableauIndiceTrouve[0] ] se trouve à l'identique à l'index 5 dans tableau ), puis 6, puis 10.


    Premièrement, le nombre de valeurs valides dans les 2 tableaux résultats est indiceTableau, c'est pour ça qu'on affiche les résultats par cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i=0; i<indiceTableau; i++) {
    Donc, au lieu de int times[] = new int[tableauIndiceTrouve.length];, c'est int times[] = new int[indiceTableau];. Pour la même raison, il faut boucler de cette façon for(int i=0; i<indiceTableau; i++){au lieu de boucler de cette manière : for(int i=0; i<tableauIndiceTrouve.length; i++){.

    Ensuite, comme les indices des tableaux résultats sont liés, il ne faut surtout pas en trier un sans trier l'autre en correspondance (on perd la correspondance). Et ce n'est pas simple de le faire.

    Après, je ne sais pas pourquoi dans ton calcul tu vas diviser des indices dans un tableau par 2 (division entière en plus). Non seulement ça n'a aucun sens, mais ça doit pas faire grand chose, parce que la condition ne doit pas être vraie souvent (il faut qu'une valeur trouvée en double ait un indice qui soit le double (à la division entière près) de celui d'une autre valeur trouvée en double !).

    Reprenons nos tableaux de l'exemple que je t'ai donnée :
    • 1, 2, 3, 4, 5, 2, 3, 6, 7, 8, 2, 9
    • 1, 2, 5
    • 5, 6, 10

    Dans le premier tableau, on a des valeurs. Dans les 2 autres, on a des indices dans le premier tableau. Dans le premier des 2, on a l'indice 1, avec dans le second, l'indice 5 : la valeur situé à l'indice 1 du premier tableau est aussi à l'indice 5. C'est ça que veut dire les données dans ce tableau.
    Comme 5 est un indice, le 5 qui se trouve dans le premier des 2 tableaux résultats étant aussi un indice, il s'agit du même indice, donc de la même valeur : voici un moyen simple donc de compter le nombre d’occurrences.

    On parcourt le premier tableau résultat (donc tableauIndiceCherche), avec un boucle for sur i par exemple (for(int i=0; i<indiceTableau; i++){). Pour chaque valeur d'indice i dans tableauIndiceCherche(donc tableauIndiceCherche[i]), on compte déjà au moins 2 (la valeur tableauIndiceCherche[i] est au moins 1 fois en double).
    Ensuite on regarde où se trouve son double : tableauIndiceTrouve[i]. Il n'y a plus qu'a rechercher cette valeur dans tableauIndiceCherche : si on ne la trouve pas, la valeur ne se trouve que 2 fois dans le tableau d'entrée. On affiche 2 et on boucle pour traiter la suivante.
    En revanche, si on l'a trouve, on incrémente le compteur parce que la valeur s'y trouve donc une fois de plus, puis on recommence : on regarde le correspondant dans tableauIndiceTrouve, on le cherche dans tableauIndiceCherche, etc, jusqu’à ce qu'on ne trouve plus dans tableauIndiceTrouve l'index trouvé dans tableauIndexCherche. Là on affiche le compteur).

    Il se trouve qu'en plus tu peux réutiliser la méthode recherche pour chercher tableauIndiceCherche[i] dans tableauIndiceTrouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int autre = cherche(tableauIndiceTrouve, tableauIndiceCherche[i], i++);
    if ( autre == -1 ) {
        // pas trouvé d'autre
    }
    else {
       // autre contient l'indice du suivant
    }
    Il y a juste un petit problème à régler : lorsqu'on va traiter le tableau 1, 2, 5, on va traiter 2 fois la même valeur de tableau (quand on va traiter le 1 et quand on va traiter le 5). En se limitant au strict usage des tableaux, il suffit d'ignorer dans la boucle for les valeurs de tableauIndiceCherche qu'on trouve dans tableauIndiceTrouve, justement qu'elles seront traitées par l'autre code décrit juste ci-avant (la boucle de comptage).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i=0; i<indiceTableau; i++){
    if ( !recherche(tableauIndiceTrouve, tableauIndiceCherche[i],0) ) {
       // on ne compte que ces valeurs
    }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 113
    Par défaut modifié mais je sais pas si c'est juste a cause erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    		int times[] = new int[indiceTableau];
     
    		for(int i=0; i<indiceTableau; i++){
    	        int number = tableauIndiceTrouve[i];
    	        for(int ii=0; ii<indiceTableau; ii++){
    	            if(number == tableauIndiceTrouve[ii]/2){
    	                times[i]++;
     
    	            }
    	        }     
    	    }
    	    for(int ii=0; ii<tableauIndiceTrouve.length; ii++){
     
    	        System.out.println("The number " + tableauIndiceTrouve[ii]/5 + " is repeted " + times[ii] + " times");
    	    }
     
    	}
     
    	public static int recherche(int maValeur, int[] tab, int depart) {
    		int monIndice = -1;
    		for (int i = depart; monIndice == -1 && i < tab.length; i++) {
     
    			if (maValeur == tab[i]) {
    				// System.out.println(i);
    				monIndice = i;
     
    			}
    		}
    		return monIndice;
    	}
    *
    erreur :
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 560
    at file.files.<init>(files.java:109)
    at file.files.main(files.java:132)



    toute les valeur repeted a zero

    merci

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    ArrayIndexOutOfBoundsException : tu accèdes à un indice en dehors des limites du tableau (soit inférieur à 0, soit supérieur ou égal à son nombre d'éléments !)
    Le tableau times a pour nombre d'éléments indiceTableau, pas tableauIndiceTrouve.length (tu as déclaré ce tableau (tableauIndiceTrouve) avec la taille du tableau d'origine (parce que tu ne pouvais pas connaitre sa vraie taille finale d'avance), donc sa taille est forcément plus grande que le nombre de doublons (le dernier n (quel que soit sa valeur) n'ayant pas de n doublon suivant)).
    C'est pour ça que je t'ai dit qu'il ne fallait traiter que les valeurs pour les indices entre 0 et indiceTableau (les autres, c'est forcément 0 et elles n'ont aucun sens et ne représentent rien par rapport au résultat voulu).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       for(int ii=0; ii<tableauIndiceTrouve.lengthindiceTableau; ii++){
    
    	        System.out.println("The number " + tableauIndiceTrouve[ii]/5 + " is repeted " + times[ii] + " times");
    	    }
    Citation Envoyé par giovanni Voir le message
    toute les valeur repeted a zero
    Probable que cela soit dû à la division par 5 (un entier divisé par un entier donne un entier, un nombre inférieur à 5 divisé par 5 donne 0). Mais ça sert à quoi de diviser par 5 la valeur ? Si tu dois afficher le nombre qui est répété, tu affiches le nombre, pas le nombre divisé par 5 !
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/05/2014, 10h29
  2. probleme recherche dans un tableau
    Par misakilou dans le forum Langage
    Réponses: 3
    Dernier message: 31/10/2010, 11h30
  3. URGENt: recherche dans un tableau trié par ordre alphabetiqu
    Par JulPop dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/02/2005, 17h21
  4. Recherche dans une liste non trié
    Par Oberown dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 13/09/2004, 13h56
  5. [BPW]Problème de recherche dans une boîte liste
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 14
    Dernier message: 05/07/2003, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo