2016-06-20 4 views
0

В моем случае использования я хотел бы сохранить дату в объекте и отсортировать объект на основе даты [пользовательский компаратор] в java. Я попытался следующий код,Как хранить дату с миллисекундами и сортировать с помощью коллекций в 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); 
    } 

} 

Я пытаюсь сохранить дату с миллисекундой после разбора простого формата даты.

Но он не работает. Может ли кто-нибудь помочь мне в этом?

ответ

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);

+0

У меня нет ошибок. Я пытаюсь получить твиты в отсортированном порядке. Я не разбираюсь в порядке. Он сортирует только секунды, а не миллисекунды. Я добавил еще одну функцию для твита, где я сделал сортировку. – Dany

+1

@ У вас есть ошибка, потому что вы отбрасываете ее. Вы не должны использовать текущую дату по умолчанию, потому что это просто скроет ошибки и даст вам поведение, которое вы видите. –

+0

@ Дата Дани просто завершает длительность, которая составляет миллисекунду. Невозможно указать, что вы хотите сортировать только за секунды, даже если хотите. –

2

У вас в коде есть несколько ненужных строк, которые, я полагаю, остались в стороне от разных попыток, поэтому лучше сначала их очистить.

Вы использовали сопоставимый интерфейс для класса Tweet, но вместо этого используя метод сравнения из класса Tweet, вы используете другой компаратор.

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 ведут себя по-разному: сортировка по возрастанию и вторая по убыванию. Вы, вероятно, хотите использовать

Collections.sort(newsFeedTweets); 

вместо встроенного компаратора.

+0

Да. Это ошибка. Благодарю. Но он приходит в порядок даже после удаления пользовательского компаратора. Это происходит только тогда, когда я добавляю несколько твитов непрерывно. Поэтому я думал, что это не займет миллисекунды. – Dany

1

В комментариях вы просили лучше узнать текущее время на ваших объектах.

Лучше всего избегать использования печально известных проблемных классов времени, связанных с самыми ранними версиями Java.

java.time

Вместо этого используйте java.time структуру, встроенную в Java 8 и более поздних версий. См. 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 на текущий момент захватывается только с разрешением до миллисекунд (до 3 знаков после запятой дробной секунды) из-за использования устаревшей реализации Clock. В Java 9 текущий момент фиксируется до наносекундного разрешения (до 9 знаков после запятой), в зависимости от способности ваших аппаратных часов компьютера.

Сортировка

Для сортировки, определить ваш Comparator используя compareTo метод, встроенный в Instant.

Держите его просто

Так что нет необходимости разбирать строки или получить миллисекунды-кол-from- epoch, как попытка в этом вопросе. Решение намного проще.

Поиск переполнения стека для многих других обсуждений и примеров java.time.

+0

Спасибо, Василий. Я согласен, что UTC имеет больше смысла. Позвольте мне попробовать мгновенно. – Dany

 Смежные вопросы

  • Нет связанных вопросов^_^