在 Java 中使用时间对 ArrayList 进行排序
Posted
技术标签:
【中文标题】在 Java 中使用时间对 ArrayList 进行排序【英文标题】:Sort ArrayList with times in Java 【发布时间】:2016-06-10 20:43:19 【问题描述】:我有一个List<String>
,其中包含从上午 8:00 到下午 4:00 的时间列表。
当我在输出中显示它时,它显示为未排序,当我使用 Collections.sort(myList);
时,它从下午 1:00 到上午 8:00 排序。
如何从上午 8:00 到下午 4:00 对我的列表进行排序?
【问题讨论】:
在您的列表中使用 24 小时时间格式,然后对其进行排序。您可以随时将其恢复为上午和下午。 【参考方案1】:不要重新发明***,使用集合(如果允许 java8,则使用 Lambdas) 如何??: 将列表保留为字符串,但使用匿名比较器,在那里,将字符串解析为日期,比较它们就可以了。 这是一个sn-p:
List<String> l = new ArrayList<String>();
l.add("8:00 am");
l.add("8:32 am");
l.add("8:10 am");
l.add("1:00 pm");
l.add("3:00 pm");
l.add("2:00 pm");
Collections.sort(l, new Comparator<String>()
@Override
public int compare(String o1, String o2)
try
return new SimpleDateFormat("hh:mm a").parse(o1).compareTo(new SimpleDateFormat("hh:mm a").parse(o2));
catch (ParseException e)
return 0;
);
System.out.println(l);
【讨论】:
很好的答案,谢谢。 :)【参考方案2】:将您的字符串转换为日期并对日期进行排序。一般来说,在 Java 中,您应该始终按原样处理对象,而不是字符串。字符串是名称或其他文本,当字符串有特殊含义时,您最好将其转换为有意义的对象。
【讨论】:
【参考方案3】:这是你想做的一个简短的程序。
public static void main(String[] args) throws ParseException
ArrayList<String> times = new ArrayList<String>();
times.add("8:00 pm");
times.add("8:00 am");
times.add("7:00 pm");
times.add("7:00 am");
ArrayList<Date> dates = new ArrayList<Date>();
DateFormat format = new SimpleDateFormat("h:m a", Locale.ENGLISH);
for(String time : times)
dates.add(format.parse(time));
Collections.sort(dates);
System.out.println(dates);
步骤:
将每个字符串转换为标准化的Date
使用Collections.sort()
排序
【讨论】:
【参考方案4】:DetailsVOTemp
模型有时间并添加 set-get 方法,我已经有一个列表,它是带有列表名称的列表。
从列表中获取时间和纬度,并存储在两个数组列表中,然后最终对其进行排序
List< DetailsVOTemp> firstlist = new ArrayList<>();
List<DetailsVOTemp> secondlisr = new ArrayList<>();
for (int i = 0; i < list.size(); i++)
DetailsVOTemp mDetailsVOTemp = new DetailsVOTemp();
mDetailsVOTemp.setTime(list.get(i).getTime());
mDetailsVOTemp.setAdd(list.get(i).getLatLong());
mVoTemps.add(mDetailsVOTemp);
for (int i = 0; i < list.size(); i++)
DetailsVOTemp mDetailsVOTemp = new DetailsVOTemp();
mDetailsVOTemp.setTime(list.get(i).getDropOffTime());
mDetailsVOTemp.setAdd(list.get(i).getDropLatLong());
mVoTemps1.add(mDetailsVOTemp);
mVoTemps.addAll(mVoTemps1);
Collections.sort(mVoTemps, new Comparator<DetailsVOTemp>()
@Override
public int compare(DetailsVOTemp o1, DetailsVOTemp o2)
return o1.getTime().compareTo(o2.getTime());
);
StringBuilder mBuilder = new StringBuilder();
StringBuilder mBuilder1 = new StringBuilder();
for (int i = 0; i < mVoTemps.size(); i++)
mBuilder1.append(mVoTemps.get(i).getTime() +" :: ");
mBuilder.append(mVoTemps.get(i).getAdd() +" :: ");
Log.d("Time : ", mBuilder1.toString());
Log.d("Address : ", mBuilder.toString());
【讨论】:
【参考方案5】:在您的列表中使用 24 小时时间格式,然后对其进行排序。
您可以随时将其恢复为上午和下午。
【讨论】:
【参考方案6】:和其他人一样,我建议不要重新发明***,并且我还建议丢弃旧的和过时的类 SimpleDateFormat
和 Date
。这些天我们过得好多了。
给定
static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);
我们可以的
Collections.sort(listOfTimeStrings,
Comparator.comparing(
(String s) -> LocalTime.parse(s.toUpperCase(), dtf)));
这适用于几百个字符串,也许更多。但是,每次要比较两个字符串时,它都会解析每个字符串。那可能是很多次。如果您只想解析每个字符串一次,请改为:
List<String> sortedList = listOfTimeStrings.stream()
.map(String::toUpperCase)
.map(s -> LocalTime.parse(s, dtf))
.sorted()
.map(dtf::format)
.map(String::toLowerCase)
.collect(Collectors.toList());
当您以小写形式给出 am 和 pm 时,我已将其视为字面意思,因此我在解析之前将其转换为大写,在格式化之后再转换为小写。根据您的数据,您可以跳过这些步骤。
【讨论】:
以上是关于在 Java 中使用时间对 ArrayList 进行排序的主要内容,如果未能解决你的问题,请参考以下文章
CopyOnWrite 思想及在 Java 并发包中的具体体现