【问题标题】:Check if a list of dates contains a particular date检查日期列表是否包含特定日期
【发布时间】:2012-07-28 01:49:12
【问题描述】:

我正在寻找一种更好的方法来检查 List 中的 java.util.Date 对象(ArrayList,返回给我)。情况是,我返回了一个日期的 List,我想知道我手头的日期是否在返回日期的 List 之内。

目前我正在做的是循环列表并使用 JodaTime 比较日期。

注意:在比较日期时只应考虑日期部分(而不是时间部分)。

【问题讨论】:

  • 您想要一个 HashMap/HashSet 以便在 O(1) 时间内找到它?
  • 请提供更多详细信息。你有 java.util.Date 对象的列表吗?字符串?其他类型的日期表示?
  • 我有一个 java.util.Date 对象列表。
  • 告诉我们列表是按任何特定顺序排序还是随机排序怎么样?
  • 嗨,安迪,没有订单。谢谢

标签: java date jodatime


【解决方案1】:

写你自己的Comparator。您可以使用它来执行 Date 对象的单独比较

public class MyDateComparator implements Comparator<Date> {
    protected static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");

    public int compare(Date d1, Date d2) {
        return DATE_FORMAT.format(d1).compareTo(DATE_FORMAT.format(d2));
    }
}


Date myDate = ...
List<Date> listOfDates = ...
Collections.sort(listOfDates);
int index = Collections.binarySearch(listOfDates, myDate, new MyDateComparator());
if (index >= 0) {
  // you found me
}

(用胖手指在 iPad 上打字,摇着 3 个月大的宝宝睡觉,为小错误道歉)

【讨论】:

  • 您可以修改比较器,或者根据需要提供不同的比较器。我唯一不喜欢二进制搜索的是它不会返回索引数组,但这是另一个问题
  • 我喜欢使用 Java Comparator/Comparable,因为这是推荐的方式。但不确定我是否应该将 java.util.Date 转换为 JodaTime 的 DateTime 并在 Comparator 中使用 JodaTime 进行日期比较。您对此有何看法?
  • 这完全取决于你。您必须权衡时间成本(开发时间和执行时间),以及内存开销与解决方案的说服力。使用 Comparator/Comparable API 的主要原因是它在整个 Java API 中得到很好的支持。在一天结束时,Joda Time 仍然只使用 Comarator API,它比我演示的更丰富;)
  • 新用户@santaji 提出了一个编辑:Collections.sort(listOfDates,new MyDateComparator()); 声明“listOfDates 需要使用 MyDateComparator() 进行排序,然后只有 Collections.binarySearch() 才能工作。”我拒绝了他的修改。
  • if (index != -1) 应该是 if (index &gt;= 0) 否则会发生坏事
【解决方案2】:

如果两个 java.util.Date 对象解析为相同的毫秒,则它们是 equal()。所以你可以使用 List.contains():

http://docs.oracle.com/javase/6/docs/api/java/util/List.html#contains%28java.lang.Object%29 http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#equals%28java.lang.Object%29

List<Date> dates = ...
Date targetDate = ...
if (dates.contains(targetDate)) { ... }

或者,如果您知道列表已排序,则可以使用 Collections.binarySearch()

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#binarySearch%28java.util.List,%20java.lang.Object%29

【讨论】:

  • 对不起,只考虑日期部分,在我的情况下,时间部分不能用于比较。
  • 但是Listscontains()的搜索方法是什么?我相信他应该使用某种最适合这种情况的搜索方法。除非contains() 已经这样做了。这就是我刚才说的静音lol。
  • @ChinBoon:哦,我误会了。在这种情况下,循环和使用 JodaTime 可能是要走的路。顺便说一句,请确保在进行比较时使用正确的时区。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多