6
votes

Java Trier un tableau de mois en plusieurs tableaux par mois

J'ai un tableau en Java contenant un ensemble de dates aléatoires:

{20 janvier 2015, le 12 février 2015, 20 février 2015, 21 juin 2015, 12 juillet 2015, 28 juillet 2015, 30 juillet 2015, 24 septembre 2015, 31 décembre 2015}

Comment puis-je diviser ce tableau en plusieurs tableaux par mois?

Je voudrais

{{20 janvier 2015}, {le 12 février 2015, 20 février 2015}, {21 juin 2015}, {12 juillet 2015, 28 juillet 2015, 30 juillet 2015}, {24 septembre 2015}, {31 décembre 2015}}

Je pourrais parcourir tout le tableau et vérifier si la date suivante est toujours dans le même mois, puis l'ajoutez à la sous-matrice si elle est. Cependant, je me demandais s'il y avait une méthode plus succincte ou efficace.

EDIT:

En outre, j'ai besoin de trier à l'année et au mois pour Exemple, 15 janvier 2014 et 23 janvier 2015 ne devraient pas être combinés.

Voici une méthode que j'ai proposée, mais cela n'a pas l'air terriblement efficace: xxx


7 commentaires

Par mois seulement ou par an / mois? Par exemple. Devrait Jan 15 2014 et 23 janvier 2015 ÊTRE COMBINÉ OU PAS? Et le tableau est-il toujours trié, ou les dates peuvent-elles être dans un ordre aléatoire?


Peut-être devriez-vous utiliser une carte de >. Pensez que cela vous servira mieux.


Pourquoi ne pas simplement utiliser une liste de liste comme Liste > de 0-11 chaque mois correspondrait à l'index approprié i.e. Toutes les dates de mois de janvier seraient dans l'index 0.


Ouais, je suis d'accord, en utilisant list > traitera considérablement le problème


Cependant, tous les mois sont nécessaires, comme je l'ai noté dans l'exemple de tableau. Janvier et février apparaissent par exemple, mais mars, avril et ne sont pas utilisés.


@Andreas Je n'ai pas précisé, mais j'ai besoin d'ici l'année et du mois, le 15 janvier 2014 et le 23 janvier 2015 ne devraient pas être combinés. De plus, j'ai déjà les dates pour être en ordre.


@Wayway Veuillez poster des informations supplémentaires / clarification en modifiant votre question plutôt que de poster comme des commentaires.


3 Réponses :


0
votes

Utilisation de Java 8 Collecteurs.GroupingBy, il renvoie une carte, puis obtenez des valeurs TOLIST.

    List<List<Date>> partitions = dates.stream().collect(Collectors.groupingBy(e -> e.getYear() * 100 + e.getMonth(), TreeMap::new, Collectors.toList())).values().stream().collect(Collectors.toList());


2 commentaires

Question Tagged "Android" alors Java 8 n'est pas disponible.


Mais vous pouvez toujours utiliser "E -> E.GETYEAR () * 100 + e.getMonth ()" Méthode pour trier les dates



2
votes

Vous êtes sur la bonne voie, mais Stringifier l'année / mois est la voie lente, juste suivre l'année et le mois: xxx

Notez que le paramètre doit être prédéfini. Les commentaires de la question + ont été un peu flous sur ce point.

code de test xxx

la sortie > xxx


0 commentaires

0
votes

Joda-Time

pour Android, vous devriez utiliser Joda-Time A > Bibliothèque plutôt que les anciennes classes Java.Util.Date/.calendar qui ont prouvé être si gênante. Notez que certaines éditions alternatives de Joda-Time ont été publiées pour contourner un problème Android avec une lenteur initiale. P>

Joda-Time inclut une classe YearMonth code> , juste ce dont nous avons besoin pour représenter l'année et le mois comme une clé pour suivre les valeurs de date. Joda-Time a également une classe localDate pour représenter une valeur de la date à la date sans aucun fuseau horaire ou horaire. P>

Nous définissons un FORMATTER avec motif " MMMM DD YYYY " code> pour analyser les cordes. Notez que nous spécifions un locale avec anglais

langue sur le formateur de sorte que ceci Le code fonctionnera avec succès sur JVMS où la locale par défaut actuelle a une langue autre que l'anglais. Que la langue s'applique lors de l'analyse des noms des mois "janvier", "février", et ainsi de suite. P>

Nous collectons les valeurs locales comme un triède code> qui répond à deux fins, (a) élimine les doublons et (b ) Garde les dates triées. Notre implémentation de triède code> est un arbreset code> . Chaque objet de jeu est attribué à un objet code> YearMonth code>. TREEMAP CODE> A > Suites que YearMonth code> a cet ensemble de dates. Nous utilisons un Treemap code> plutôt que hashmap code> pour conserver les clés dans la commande triée, car elle implémente triedmap code> . Si vous avez eu des nombres énormes d'éléments et de tri par clé n'étaient pas critiques, il pourrait s'agir d'un meilleur choix pour la performance. P>

System.out.println( "input: " + Arrays.toString( input ) );
System.out.println( "map: " + map );


0 commentaires