2013-02-25 4 views
0

Je sais sur leconclusion fréquence dans l'objet Collections en java

Collections.frequency(obj1,obj2); 

me donne le nombre de fois qu'un obj2 objet existe dans la collection obj1. mais je veux demander à dire que obj1 est une collection (liste) composée d'objets (étudiant).

et un étudiant peut avoir {nom, marques}

est ensuite à travers laquelle une possible simple ou 2 lignes façon dont je peux trouver le nombre d'étudiants qui ont marqué les mêmes marques

I ne veulent pas de bibliothèques supplémentaires à inclure

+0

Lorsque vous dites «nombre d'étudiants qui ont obtenu les mêmes notes», voulez-vous dire que vous voulez le nombre d'étudiants qui ont tous obtenu une note particulière? Ou le nombre d'élèves qui ont obtenu des notes non uniques? Ou une liste de fréquences pour les différentes marques? Ou quoi? – chm

+0

Votre question semble être un prélude à une diatribe (notez que je ne veux pas l'impliquer) à propos de la complexité de Java. "Je veux faire quelque chose qui n'est probablement pas assez commun pour avoir sa propre méthode de cadre de collections de 10 lignes, je veux le faire en deux lignes et je ne veux pas qu'il soit fait par une autre bibliothèque." Eh bien, c'est "choisir deux" alors, je suppose. –

+0

@ chm052 .. nombre d'étudiants qui ont tous marqué une marque particulière –

Répondre

4

Collection.frequency renvoie le nombre d'éléments dans le spécifi ed collection égale à l'objet spécifié. Cela équivaut essentiellement à obj2 avec les objets List.

Si vous substituez la méthode equals et que vous mettez votre logique comme basée sur l'attribut de score, l'objet sera égal ou non. Puis Collection.frequency renvoyer le résultat souhaité.

public class Student{ 
    private String name; 
    private int score; 
    @Override 
    public boolean equals(Object obj){ 
     if(obj == null) 
      return false; 
     else if(this==obj) 
      return true; 
     else 
      return this.hashCode() == ((Student)obj).hashCode(); 
    } 
    @Override 
    public int hashCode() { 
     return score; 
    } 
} 

...

int freq = Collections.frequency(listOfStudent,student); 
+0

Mes appréhensions 1) si je dois remplacer la méthode égale alors je devra également surcharger la méthode hashCode (efficace java). 2) Dans le contexte de la question ci-dessus, si je remplace la méthode d'égalité, ce que je dis, c'est que si les notes de deux étudiants sont égales, elles sont également égales: O. J'espère que vous avez compris mes appréhensions. –

+0

yap il est recommandé car il est utilisé dans 'HashMap',' HashSet' où ce hash est utilisé. [Link] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk /openjdk/6-b14/java/util/HashMap.java#HashMap.put%28java.lang.Object%2Cjava.lang.Object%29) –

0

Je pense que vous devez utiliser la carte au lieu de la liste

+0

je suppose que vous n'avez pas compris ma question ... aimablement d'abord regarder la fréquence des collections (java) –

0

Vous pouvez addAll les notes des élèves à un Set de marques, puis comparer si la taille de l'ensemble est inférieure à la taille de l'original List/Map .

1

Si vous êtes réticent à modifier votre méthode equals pour signifier les mêmes scores == même étudiant, vous pouvez utiliser une carte pour réaliser ce que vous voulez je pense. Vous devez faire un peu plus la configuration, mais la récupération doit être de 1 ou 2 lignes:

// setup/population 
Map<Score, List<Student>> map = new HashMap<Score, List<Student>>(); 
for (Student student : students) { 
    List<Student> studentsForScore = new ArrayList<Student>(); 
    if(map.containsKey(student.getScore())) { 
    studentsForScore = map.get(student.getScore()); 
    } 
    studentsForScore.add(student); 
    map.put(student.getScore(), studentsForScore); 
} 

// information retrieval 
Student testStudent = ... 
int numberOfStudentsWithSameScore = map.containsKey(testStudent.getScore()) ? map.get(testStudent.getScore()).size() : 0; 

Cela suppose bien sûr que vous êtes prêt à accepter le coût du bloc de configuration. Ce qui serait bien serait de pouvoir passer un Comparator (ou équivalent) à la méthode Collections.frequency - si vous pouviez obtenir le meilleur des deux mondes. Comme vous ne pouvez pas, vous pouvez envelopper le code ci-dessus dans votre propre méthode frequency