web-dev-qa-db-fra.com

Comment trier Date qui est au format string en java?

J'ai un arraylist avec des valeurs de chaîne comme

ArrayList<String> datestring=new ArrayList<String>();
datestring.add("01/21/2013 @03:13 PM");
datestring.add("01/21/2013 @04:37 PM");
datestring.add("01/21/2013 @10:41 AM");
datestring.add("01/21/2013 @10:48 AM");
datestring.add("01/22/2013 @06:16 AM");
datestring.add("01/22/2013 @06:19 AM");
datestring.add("01/21/2013 @05:19 PM");
datestring.add("01/21/2013 @05:19 PM");

Tout organisme peut-il m'aider à trier la liste ci-dessus? Pour que les valeurs soient triées selon les formats AM et PM.
Le résultat attendu après le tri doit être

for (String s : datestring)
{
    System.out.println(s);
}

.

01/21/2013 @10:41 AM;
01/21/2013 @10:48 AM;
01/21/2013 @03:13 PM;
01/21/2013 @04:37 PM;
01/21/2013 @05:16 PM;
01/21/2013 @05:19 PM;
01/22/2013 @06:16 AM;
01/22/2013 @06:19 AM;
20
user1740005

essaye ça

    Collections.sort(datestring, new Comparator<String>() {
        DateFormat f = new SimpleDateFormat("MM/dd/yyyy '@'hh:mm a");
        @Override
        public int compare(String o1, String o2) {
            try {
                return f.parse(o1).compareTo(f.parse(o2));
            } catch (ParseException e) {
                throw new IllegalArgumentException(e);
            }
        }
    });

ou avec Java 8 

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy '@'hh:mm a");
    Collections.sort(datestring, (s1, s2) -> LocalDateTime.parse(s1, formatter).
            compareTo(LocalDateTime.parse(s2, formatter)));
64
Evgeniy Dorofeev

Bien qu’il existe un moyen technique de contourner votre problème, l’erreur fondamentale est de représenter Dates sous la forme Strings, une forme «d'obsession primitive» . Si vous avez une entrée textuelle, convertissez-la en Java.util.Date ou une autre méthode appropriée. classe joda ( LocalDateTime semble approprié ici). Ces classes implémentent Comparable dès la sortie de la boîte et leur tri est facile. Mais ils ont également toute la logique dont vous aurez probablement besoin pour manipuler des instances de date/heure, mais pas les chaînes.

Mettre à jour

Depuis Java 8, je recommanderais plutôt d’utiliser sa classe LocalDateTime class.

3
bowmore

Java.time

Tout d’abord, comme Bowmore a déjà dit , vous ne devriez pas garder de chaînes dans votre liste. A la place, utilisez des instances de classes Java.time.

Conservez les objets LocalDateTime. Ou ZonedDateTime si vous savez dans quel fuseau horaire se trouvent les heures. Les chaînes sont bonnes pour la présentation à l'utilisateur, pas pour les manipulations dans votre programme telles que le tri.

Le code suivant convertit votre liste en un List<LocalDateTime>:

    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("MM/dd/uuuu '@'hh:mm a", Locale.ENGLISH);

    List<LocalDateTime> dateTimeList = datestring.stream()
            .map(ds -> LocalDateTime.parse(ds, formatter))
            .collect(Collectors.toCollection(ArrayList::new));

Maintenant, le tri est simple:

dateTimeList.sort(Comparator.naturalOrder());

LocalDateTime ont un ordre naturel depuis qu'ils implémentent Comparable, donc Comparator.naturalOrder() convient pour le tri. Un autre moyen d'obtenir le même tri est:

dateTimeList.sort(LocalDateTime::compareTo);

Pour présenter les données triées à l'utilisateur, nous souhaitons formater la date-heure en chaînes, bien sûr:

dateTimeList.forEach(ldt -> System.out.println(ldt.format(formatter)));

La sortie est:

01/21/2013 @10:41 AM
01/21/2013 @10:48 AM
01/21/2013 @03:13 PM
01/21/2013 @04:37 PM
01/21/2013 @05:19 PM
01/21/2013 @05:19 PM
01/22/2013 @06:16 AM
01/22/2013 @06:19 AM

À l'exception des points-virgules et d'une simple faute de frappe, je pense que c'est précisément ce que vous avez demandé.

Link:Tutoriel Oracle: Date Time expliquant comment utiliser Java.time, l'API de date et heure moderne de Java, qui inclut LocalDateTime et DateTimeFormatter.

3
Ole V.V.

On peut comparer la liste de date au format chaîne en utilisant le compareTo comme indiqué ci-dessous.

ArrayList<String> datestring=new ArrayList<String>();
datestring.add("01/21/2013 @03:13 PM");
datestring.add("01/21/2013 @04:37 PM");
datestring.add("01/21/2013 @10:41 AM");
datestring.add("01/21/2013 @10:48 AM");
datestring.add("01/22/2013 @06:16 AM");
datestring.add("01/22/2013 @06:19 AM");
datestring.add("01/21/2013 @05:19 PM");
datestring.add("01/21/2013 @05:19 PM");

Collections.sort(datestring, new Comparator<String>() {
                @Override
                public int compare(String object1, String object2) {
                    return object1.compareTo(object2);
                }
            });

En utilisant cela, vous n'avez même pas besoin d'analyser la chaîne en date

2
Navankur Chauhan

ArrayList ne prend pas en charge le tri par défaut. Vous pouvez utiliser 

public static <T> void sort(List<T> list, Comparator<? super T> c) de Java.util.Collections class. passez votre implémentation de comparateur pour trier les dates, quelque chose comme 

http://www.coderanch.com/t/392338/Java/java/compare-Dates-String-Format

0
Prateek

Une option consiste à ajouter les dates à une TreeMap, avec la date non formatée comme clé et la date formatée comme valeur. L'utilisation d'une TreeMap va trier les valeurs automatiquement.

private ArrayList<String> sortDates(ArrayList<String> dates) throws ParseException {
    SimpleDateFormat f = new SimpleDateFormat("dd MMM yyyy");
    Map <Date, String> dateFormatMap = new TreeMap<>();
    for (String date: dates)
        dateFormatMap.put(f.parse(date), date);
    return new ArrayList<>(dateFormatMap.values());
}
0
Conor Pender