2014-04-25 2 views
0

J'ai un objet.structure de données qui contient deux types de données différents java

public class Test{ 

int age; 
LocalDateTime currentTime; 

//class also contains getters and setters. 

} 

Supposons que j'ai une liste et que j'ai besoin de calculer l'âge moyen. Je itéère tout, ajoute des valeurs puis divise par la taille de la liste. Maintenant, j'ai besoin de calculer la différence entre l'âge et la moyenne. Si la différence entre l'âge et la répétition moyenne (est la même entre les différents objets de la liste) alors j'ai besoin de supprimer l'objet avec l'horodatage le plus tôt dans le tableau.

Je suis bloqué sur la façon de procéder. Au départ, je pensais que je pouvais simplement développer la classe Test pour stocker la différence, puis faire un tri, mais je veux éviter cela. Les autres options restantes étaient de le stocker dans une carte ou de créer un objet séparé pour eux, mais cela semble très désordonné.

D'autres idées sur la façon de le faire bien?

Répondre

0

Deux objets ont la même (moyenne d'âge) si et seulement s'ils ont le même âge. Ainsi, vous pourriez par exemple trier la liste par (âge, [horodatage du dernier au premier]) (ceci peut être fait avec un comparateur) et parcourir le tableau à partir du deuxième élément, en supprimant chaque élément s'il a le même âge comme le précédent.

[edit: sauf si vous considérez la valeur absolue de la différence entre la moyenne et l'âge? Si oui, veuillez clarifier].

En fait, si vous voulez dire la valeur absolue de la différence, cela ne fait pas beaucoup de différence. Créez un comparateur qui trie votre tableau par (abs (mean-age), [timestamp du dernier au plus ancien]) et l'algorithme s'applique toujours. Si nécessaire, voir: How to use Comparator in Java to sort.

+1

Bien que l'OP ne le dise pas explicitement, je suppose qu'il voulait dire la différence absolue. Si la moyenne est de 20 ans, alors 18 ans et 22 ans ont la même différence. Dans ce cas, l'objet de 18 ans doit être supprimé. C'est ce que je comprends. Donc, votre "si" semble être faux. – Seelenvirtuose

0

Ici vous n'avez pas besoin signifie dans l'algorithme de suppression

alors essayez d'utiliser deux pour les boucles

for(int i=0; i<list.size();++i){ 

    Test currentTest = list.get(i); 

    List<Test> toRemove = new LinkedList<>(); 
    for(int j=i+1;j<list.size();++j){ 
     Test test = list.get(j); 
     if(currentTest.age == test.age){ 
       if(currentTest.currentTime.after(test.currentTime){ 
        toRemove.add(currentTest); 
        currentTest = test; 
       } else { 
        toRemove.add(test); 
       } 
     } 
    } 
    list.removeAll(toRemove); 
} 

Ou vous pouvez à la première liste de tri par le temps (du début à plus, itérer sur la liste et supprimer des éléments s'ils ont le même âge et sont après l'élément courant). Ou utilisez treemap avec la clé d'âge, parcourez la liste, vérifiez si l'élément est dans l'arborescence, sinon ajoutez else comparez currentTime et remplacez si nécessaire. Ensuite, obtenez toutes les valeurs définies. Rappelez-vous que si vous avez besoin de compter, vous devez le compter avant de supprimer un élément de la liste.

+0

Cela fonctionne bien sûr, mais dans ce cas, l'utilisation d'un algorithme O (n²) ne serait pas qualifié de faire les choses "gentiment" à mon avis. – Zoyd

Questions connexes