在我的用例中,我想将日期存储在一个对象中,并根据java中的日期[自定义比较器]对对象进行排序。我尝试了以下代码,
class Tweet implements Comparable<Tweet>{
int tweetId;
Date dateTime;
public Tweet(int tweetId, Date dateTime)
{
this.tweetId = tweetId;
this.dateTime = dateTime;
}
public Date getDateTime()
{
return dateTime;
}
public int getTweetId()
{
return tweetId;
}
@Override
public int compareTo(Tweet o)
{
if (getDateTime() == null || o.getDateTime() == null)
return 0;
return getDateTime().compareTo(o.getDateTime());
}
}
public class ApplicationObj
{
/** Compose a new tweet. */
public void postTweet(int userId, int tweetId) {
Date date = new Date();
User user;
Date dTime = new Date();
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String dateTime = sdf.format(date);
dTime = sdf.parse(dateTime);
} catch (ParseException e)
{
;
}
if(!userMap.containsKey(userId))
{
user = new User(userId);
userMap.put(userId, user);
} else {
user = userMap.get(userId);
}
ArrayList<Tweet> tweets = user.getTweets();
tweets.add(new Tweet(tweetId, dTime));
}
public List<Integer> getNewsFeed(int userId) {
if(!userMap.containsKey(userId))
{
return new ArrayList<Integer>();
}
User user = userMap.get(userId);
ArrayList<Tweet> newsFeedTweets = new ArrayList<Tweet>();
ArrayList<Tweet> userTweets = user.getTweets();
Set<User> followers = user.getFollowers();
ArrayList<Tweet> followersTweets = getFollowersTweets(followers);
newsFeedTweets.addAll(userTweets);
newsFeedTweets.addAll(followersTweets);
Collections.sort(newsFeedTweets, new Comparator<Tweet>() {
public int compare(Tweet o1, Tweet o2) {
if (o1.getDateTime() == null || o2.getDateTime() == null)
return 0;
return o2.getDateTime().compareTo(o1.getDateTime());
}
});
ArrayList<Tweet> newsFeed;
if(newsFeedTweets.size() > 10)
{
newsFeed = new ArrayList<Tweet>(newsFeedTweets.subList(0,10));
}else {
newsFeed = newsFeedTweets;
}
for(Tweet tweet : newsFeed)
{
System.out.println("id "+tweet.getTweetId());
}
return getTweetIds(newsFeed);
}
}
我试图用简单的日期格式解析后用毫秒存储日期。
但它不起作用。有人可以帮我这个吗?
答案 0 :(得分:2)
但它不起作用。有人可以帮我这个吗?
很可能你在这里收到错误。
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String dateTime = sdf.format(date);
dTime = sdf.parse(dateTime);
} catch (ParseException e)
{
;
}
但你忽略了;
行。我建议你至少打印出错误。将该行;
替换为记录或调用System.out.println( e );
答案 1 :(得分:2)
你的代码中有很多不必要的行,我认为这些行是从不同的尝试中遗留下来的,所以最好先清理它。
你为Tweet类实现了类似的接口,但是使用Tweet类的compare方法,你正在使用另一个比较器。
Collections.sort(newsFeedTweets, new Comparator<Tweet>() {
public int compare(Tweet o1, Tweet o2) {
if (o1.getDateTime() == null || o2.getDateTime() == null)
return 0;
return o2.getDateTime().compareTo(o1.getDateTime());
}
});
上面的代码和Tweet.compare方法的行为不同,一个是asc,另一个是desc。 你可能想用
Collections.sort(newsFeedTweets);
而不是内联比较器。
答案 2 :(得分:1)
在评论中,您要求更好地记录对象的当前时间。
更好的方法是避免使用与最早版本的Java捆绑在一起的臭名昭着的旧日期时间类。
而是使用Java 8及更高版本中内置的java.time框架。见Oracle Tutorial。许多功能都是back-ported to Java 6 & 7,还有adapted to Android。
Instant
Instant
类代表UTC中时间轴上的当前时刻,分辨率为nanoseconds。通常最好在业务逻辑,存储和日志记录中内部使用UTC。仅在需要时应用时区(ZoneId
,ZonedDateTime
),以便向用户显示。
Instant instant = Instant.now();
在Tweet
班级上,定义一个如下的成员变量:
Instant whenTweeted;
在解析/生成字符串以表示日期时间值时,java.time类使用标准ISO 8601格式。最后的Z
是Zulu
的缩写,表示“UTC”。
instant.toString()→2016-06-18T12:34:56.789Z
关于解决方案,在Java 8中,由于依赖Clock
的遗留实现,当前时刻仅被捕获高达毫秒的分辨率(最多3个小数秒的小数位)。在Java 9中,当前时刻以高达纳秒的分辨率(最多9位小数)捕获,具体取决于计算机硬件时钟的能力。
要进行排序,请使用Instant
中内置的Comparator
方法定义compareTo
。
因此不需要解析字符串或从问题中尝试获得毫秒数 - 来自 - epoch。解决方案比这简单得多。
搜索Stack Overflow以获取更多关于java.time的讨论和示例。