Java problème avec compareTo

Signaler
-
 Tt -
Bonjour,
J'ai un soucis dans mon code et la faute est au niveau de compareTo
est ce que quelqu'un comprend pourquoi c'est faux?
merci

public static void occurence(String Votes[]){
  for(int i=0;i<Votes.length;i++){
  int nombreOccurence=0;
  for(int j=0;j<Votes.length;j++){
   if(Votes.compareTo(Votes[i])==Votes.compareTo(Votes[j]))
   nombreOccurence++;
   }
  System.out.println(nombreOccurence);
  }
 } 

public static void main(String args[]){
     String Votes[]={"x","z","y","y","z","x","x"};
     occurence(Votes);
}

10 réponses

Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
118
Bonjour,

Que veux tu faire avec :
Votes.compareTo(Votes[i])==Votes.compareTo(Votes[j])

D'une part Votes est un tableau, il n'a donc pas de méthode compareTo, et même s'il en avait on devrait le comparer à un autre tableau, pas un élément de ce tableau.

D'autre part la méthode compareTo renvoie un nombre positif >0, négatif <0 ou nul =0, mais on ne sait pas quelle valeur exactement, cela peut être +1 ou -1, comme +7614882 ou -1355741. Donc faire == n'a pas de sens.
La confiance n'exclut pas le contrôle
c'est bon j'ai trouvé
public static int occurence2(String Votes[]){
  
  for(int i=0;i<Votes.length;i++){
   int nombreOccurence=0;
  for(int j=0;j<Votes.length;j++){
   if(Votes[i].compareTo(Votes[j])==0){
   nombreOccurence++;
   }
  
  }
   return nombreOccurence;
  }
  
 }

j'ai du mal avec return...
je ne sais pas ou le placer...
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
118
Si c'est pour faire un compareTo==0, utilises plutôt la méthode equals...
if(Votes[i].equals(Votes[j])){

Et ton return, tu le mets à la fin... sinon le code qu'il y a ensuite ne sert à rien.
public static int occurence2(String Votes[]){
  for(int i=0;i<Votes.length;i++){
   int nombreOccurence=0;
  for(int j=0;j<Votes.length;j++){
   if(Votes[i].equals(Votes[j])){
   nombreOccurence++;
   }
  
  }
  
  }
  return nombreOccurence;
 }

error: cannot find symbol
return nombreOccurence;
^
symbol: variable nombreOccurence
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
118
nombreOccurence est déclaré à l'intérieur de la boucle for, donc il n'existe plus quand tu en sors... il faut le déclarer plus tôt.
ça ne retourne qu'une valeur donc pour retourner toutes les valeurs je pourrais mettre ça dans un arraylist
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
118
Comme tu n'as pas dit ce que devais faire ton programme, difficile de t'aider...
Tu avais un bug sur compareTo, c'est corrigé, discussion résolue ?
en faite j'aimerais faire une fonction occurrence qui calcul pour chaque élément dans un tableau l'occurrence et utiliser après la fonction occurrence
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
118
Alors c'est toujours pareil, vu que c'est un exercice je ne sais pas quelles sont tes contraintes, mais si c'est moi qui devait le faire voici ce que ça donnerait :

import java.util.HashMap;
import java.util.Map;

public class Test {

    public static <E> Map<E, Integer> occurence(E[] array) {
        Map<E, Integer> map = new HashMap<E, Integer>();
        if (array == null)
            return map;
        for (E elt : array) {
            Integer cpt = map.get(elt);
            map.put(elt, cpt == null ? 1 : cpt + 1);
        }
        return map;
    }

    public static void main(String args[]) {
        String[] votes = { "x", "z", "y", "y", "z", "x", "x" };
        System.out.println(occurence(votes)); // {x=3, y=2, z=2}
    }
}
Si je comprend bien le resultat est stockée dans une hashmap mais si je veux interroger map dans une autre fonction c'est possible?
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
118
Bien sûr, on fait ce que l'on veut. Là je l'ai passé directement à la méthode println mais on pourrait aussi la mettre dans une variable, peu importe ça ne change pas le code de la méthode...
public static boolean majoritaire(String Votes[]){
if(occurence(Votes)>Votes.length/2) return true;
else return false;
}

first type: Map<String,Integer>
second type: int

peux t on m'expliquer?
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
118
Si occurence renvoie une Map, ou une List comme tu l'as fait hier, tu ne peux certainement pas le comparer directement à un int, ça n'a pas de sens.
Mais alors comment faire ?
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
118
Comment faire quoi ?
Tu viens avec ton code et tes erreurs mais sans explication sur ce que c'est censé faire.
Moi je peux te dire quel est le problème mais pour le corriger correctement il faudrait en dire plus !
j'aimerais utiliser la fonction occurrence pour voir si par exemple 3 qui est le nombre d'occurrence de x est supérieur à Votes.length/2
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
118
Il faudrait donc déjà commencer par mettre x en paramètre de ta méthode, parce que sinon tu ne peux pas savoir que c'est son nombre d'occurrence à lui que tu veux comparer.

Et si tu précises la chaîne de caractères qui t'intéresse, est-ce que c'est vraiment utile de calculer les occurrences de toutes les valeurs ? J'en doute.

Essayes avec ces deux signatures de méthodes :

/**
 * @return le nombre de fois que str est dans tab
 */
public static int occurences(String str, String[] tab) {
    // ...
}

/**
 * @return true si le nombre d'occurence de str dans tab est supérieur à la moitié de la taille de tab.
 */
public static boolean majoritaire(String str, String[] tab) {
    // ...
}
je veux voir si par exemple pour le tableau votes:
si x , y ou z à son occurrence > votes.length/2
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
118
Si tu pars sur une Map il suffit de regarder les valeurs.

public static <E> boolean majoritaire(E[] array) {
    for (Integer cpt : occurence(array).values())
        if (cpt > array.length / 2)
            return true;
    return false;
}
est ce que quelqu'un peut m'expliquer le principe diviser pour régner?
Messages postés
16327
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 mai 2021
118
si je comprend bien :
si je voudrais créer un algorithme trouver un élément majoritaire dans un tableau avec ce principe
je divise le tableau en deux parties
et je cherche un élément majoritaire dans les deux sous-tableaux
ensuite vérifié si l'élément est majoritaire dans le tableau en entier
public static int Est-majoritaire(String [] Votes,String x){
int k=0;
for(int i=0;i<Votes.length;i++){
if(Votes[i]==x){
k++;
}
}
return k>Votes.length/2;
}
public static boolean majoritaire(String [] Votes,int x,int y){
if(Votes.length==1){
return Votes[0];
}
else
int x=majoritaire(Votes,0,Votes.length/2);
int y=majoritaire(Votes,Votes.length/2,Votes.length);
if(Est-majoritaire(Votes,x)){
return x;
}
else if(Est-majoritaire(Votes,y)){
return y;
}
else return false;
}