如何在java中以毫秒为单位存储日期并使用集合进行排序
在我的用例中,我希望将日期存储在对象中,并根据java中的日期[custom comparator]对对象进行排序。我尝试了以下代码如何在java中以毫秒为单位存储日期并使用集合进行排序,java,sorting,date,simpledateformat,comparator,Java,Sorting,Date,Simpledateformat,Comparator,在我的用例中,我希望将日期存储在对象中,并根据java中的日期[custom comparator]对对象进行排序。我尝试了以下代码 class Tweet implements Comparable<Tweet>{ int tweetId; Date dateTime; public Tweet(int tweetId, Date dateTime) { this.tweetId =
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);
}
}
类Tweet实现了可比较的{
int-tweetId;
日期时间;
公共Tweet(int-tweetId,Date-dateTime)
{
this.tweetId=tweetId;
this.dateTime=dateTime;
}
公共日期getDateTime()
{
返回日期时间;
}
public int getTweetId()
{
返回tweetId;
}
@凌驾
公共int比较(推特o)
{
if(getDateTime()==null | | o.getDateTime()==null)
返回0;
返回getDateTime().compareTo(o.getDateTime());
}
}
公共类应用程序bj
{
/**撰写一条新的推文*/
public void postweet(int userId,int tweetId){
日期=新日期();
用户;
Date dTime=新日期();
试一试{
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyy-MM-dd-HH:MM:ss.SSS”);
String dateTime=sdf.format(日期);
dTime=sdf.parse(dateTime);
}捕获(解析异常)
{
;
}
如果(!userMap.containsKey(userId))
{
用户=新用户(userId);
put(userId,user);
}否则{
user=userMap.get(userId);
}
ArrayList tweets=user.getTweets();
添加(新Tweet(tweetId,dTime));
}
公共列表getNewsFeed(int userId){
如果(!userMap.containsKey(userId))
{
返回新的ArrayList();
}
User=userMap.get(userId);
ArrayList newsFeedTweets=新的ArrayList();
ArrayList userTweets=user.getTweets();
Set followers=user.getFollowers();
ArrayList followersTweets=getFollowersTweets(追随者);
newsfeedteets.addAll(userTweets);
newsfeedteets.addAll(followersteets);
Collections.sort(newsfeedteets,newcomparator(){
公共整数比较(推特o1、推特o2){
如果(o1.getDateTime()==null | | o2.getDateTime()==null)
返回0;
返回o2.getDateTime().compareTo(o1.getDateTime());
}
});
ArrayList新闻提要;
if(newsfeedteets.size()>10)
{
newsFeed=newarraylist(newsfeedteets.subList(0,10));
}否则{
newsFeed=newsFeed推特;
}
for(Tweet:newsFeed)
{
System.out.println(“id”+tweet.getTweetId());
}
返回getTweetIds(newsFeed);
}
}
我试图在用简单的日期格式解析后以毫秒为单位存储日期
但它不起作用。有人能帮我吗
但它不起作用。有人能帮我吗
很可能您在这里遇到了错误
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)代码>
但它不起作用。有人能帮我吗
很可能您在这里遇到了错误
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)代码>您的代码中有很多不必要的行,我认为这些行是在不同的尝试中留下的,所以最好先清理它
您为Tweet类实现了comparable接口,但使用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());
}
});
而不是内联比较器 您的代码中有很多不必要的行,我认为这些行是不同尝试的结果,所以最好先清理它
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类实现了comparable接口,但使用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());
}
});
而不是内联比较器 在评论中,您要求提供更好的方法来记录对象上的当前时间
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());
}
});
更好的方法是避免使用与最早版本的Java捆绑在一起的臭名昭著的旧日期时间类
java.time
相反,请使用内置于Java8及更高版本中的框架。看见大部分功能都是可扩展的
Instant
该类表示时间线上的当前时刻,分辨率为。通常,最好在业务逻辑、存储和日志记录中内部使用UTC。仅在需要时应用时区(,),例如用于向用户显示
Instant instant = Instant.now();
在您的Tweet
类中,定义如下所示的成员变量:
Instant whenTweeted;
串
在解析/生成表示日期时间值的字符串时,java.time类使用标准格式。末尾的Z
是Zulu
的缩写,意思是“UTC”
instant.toString()→ 2016-06-18T12:34:56.789Z
决议
关于分辨率,在Java8中,当前时刻的分辨率仅为毫秒(小数点后3位为小数点秒),因为它依赖于的传统实现。在Java 9中,根据计算机硬件时钟的能力,当前时刻以纳秒分辨率(最多9位小数)捕获
分类
对于排序,请使用Instant
中内置的方法定义您的排序
保持简单
因此,无需解析字符串或从中获取毫秒计数-正如问题中所尝试的那样。解决方案要简单得多
搜索Stack Overflow以获得更多关于java.time.的讨论和示例。在您询问的评论中