【发布时间】:2015-11-29 10:34:34
【问题描述】:
伙计们,我有一个奇怪的要求。我有一个Object,它由一个Date 引用组成,更好地称为endDate。除此之外,还有另一个称为status 的字符串字段,它选择像'Soon', 'Ended' and 'Closed' 这样的对象在一个ArrayList 中。
我想对此实施排序策略。
要应用的第一个排序基于经过的时间。我想对 EndDate 进行 First 排序,与现在最接近的差异应该排在第 1 位。即如果当前时间是Sep 3,2015 7:34 PM IST 并且存在一个endDate 为Sep 3,2015 7:36 PM IST 的对象。
第二个是status,逻辑是所有带有soon的对象应该首先出现,然后是ended,然后是closed。
示例: 如果输入是
[0]( Sep 1,2015 10:36 PM IST ,ended)
[1]( Sep 3,2015 7:36 PM IST , soon )
[2]( Aug 29,2015 11:16 AM IST , closed)
[3]( Sep 7,2015 12:00 PM IST , soon )
[4]( Sep 1,2015 12:12 PM IST , ended)
那么输出应该是
[0]( Sep 3,2015 7:36 PM IST , soon)
[1]( Sep 7,2015 12:00 PM IST , soon)
[2]( Sep 1,2015 10:36 PM IST ,ended)
[3]( Sep 1,2015 12:12 PM IST , ended)
[4]( Aug 29,2015 11:16 AM IST , closed)
注意:此处使用的时间戳仅供参考
代码:比较器内部的比较实现,时间戳读取为GMT。
@Override
public int compare(JSONObject a, JSONObject b) {
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date currentdate = dateFormatLocal.parse( dateFormatGmt.format(new Date()));
} catch (ParseException e1) {
e1.printStackTrace();
}
try {
Date betEnds1 = dateFormatLocal.parse((String) a.get(KEY_NAME));
Date betEnds2 = dateFormatLocal.parse((String) b.get(KEY_NAME));
return betEnds1.compareTo(betEnds2);
}
catch (JSONException e) {
return -1;
} catch (ParseException e) {
return -1;
}
}
【问题讨论】:
-
您是否有任何代码显示尝试排序?
-
如果你还没有。看看 Comparator 类。 docs.oracle.com/javase/8/docs/api/java/util/Comparator.html。您可以将其与 Arrays.sort 一起使用
-
既然状态字符串都是预先确定好的,为什么不使用枚举呢?
-
@Turtle 我写了一个比较器,但它很简单。它需要很长的时间表示,比较它们并返回排序。但是因为我希望列表中的经过时间超过 0,所以我提出了这个问题。对象排序的比较是相对于当前时间的。第二种是状态