如何在java中以毫秒为单位存储日期并使用集合进行排序

如何在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 =

在我的用例中,我希望将日期存储在对象中,并根据java中的日期[custom comparator]对对象进行排序。我尝试了以下代码

    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.的讨论和示例。

在您询问的评论中