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} P> blockQuote>
Comment puis-je diviser ce tableau en plusieurs tableaux par mois? p>
Je voudrais P>
{{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}} p> BlockQuote>
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. P>
EDIT: B> P>
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. P>
Voici une méthode que j'ai proposée, mais cela n'a pas l'air terriblement efficace: p>
xxx pré> p>
3 Réponses :
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());
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
Vous êtes sur la bonne voie, mais Stringifier l'année / mois est la voie lente, juste suivre l'année et le mois: Notez que le paramètre doit être prédéfini. Les commentaires de la question + ont été un peu flous sur ce point. P> code de test em> p> la sortie em> > p>
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 Nous définissons un FORMATTER avec motif 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> " MMMM DD YYYY " code> pour analyser les cordes. Notez que nous spécifions un locale avec anglais
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 );
Par mois seulement ou par an / mois? Par exemple. Devrait
Jan 15 2014 Code> et
23 janvier 2015 CODE> Ê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> code> 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> code> 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.