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;
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)));
Bien qu’il existe un moyen technique de contourner votre problème, l’erreur fondamentale est de représenter Date
s sous la forme String
s, 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.
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
.
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
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
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());
}