【问题标题】:Sort using String Date depending on the Comparator?根据比较器使用字符串日期排序?
【发布时间】:2015-12-10 10:48:58
【问题描述】:

我有以下课程:

public class Book implements Cloneable {
    private int ISBN;
    private String title;
    private String publishDate;
    private int pageCount;
}

我可以使用以下代码根据Comparator 进行排序:

Comparator<Book> titleComparator = new Comparator<Book>() {
    @Override
    public int compare(Book o1, Book o2) {
        return o1.title.compareTo(o2.title);
    }
};

Comparator<Book> ISBNComparator = new Comparator<Book>() {
    @Override
    public int compare(Book o1, Book o2) {
        return Integer.valueOf(o1.ISBN).compareTo(o2.ISBN);
    }
};

public void sort(final String field, ArrayList<Book> BookList) {
    final Comparator<Book> comparator;

    if (field.equals("title")) {
        comparator = titleComparator;
    } else if (field.equals("ISBN")) {
        comparator = ISBNComparator;
    } else {
        throw new IllegalArgumentException("Comparator not found for " + field);
    }

    Collections.sort(BookList, comparator);
}

但是当发布日期格式为“25/12/2015”时,如何根据字符串 publishDate 进行排序?

【问题讨论】:

  • 我可以建议您使用更合适的类型开始吗?理想情况下,Java 8 的 LocalDate 类型...您正在尝试表示日期...那么为什么要使用字符串?
  • 您需要以java.util.Date() 格式解析日期,然后进行比较。使用纯字符串值是不正确的。
  • 这是一个很好的例子,说明为什么日期不应该是字符串

标签: java date comparator


【解决方案1】:

如果您确定不使用 Date 而不是 String,请使用此比较器(您可以添加一些缓存以避免每次都解析字符串):

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Comparator;

/**
 *
 * @author EBudaqov
 */
public class StringDateComparator implements Comparator<String>{

    private SimpleDateFormat formatter;

    public StringDateComparator(String dateFormat) {
        formatter = new SimpleDateFormat(dateFormat);
    }

    @Override
    public int compare(String s1, String s2) {
        try {
            return formatter.parse(s1).compareTo(formatter.parse(s2));
        } catch(ParseException exception) {
            throw new RuntimeException(exception);
        }
    }

    public static void main(String[] args) {
        String s1 = "01/01/2015";
        String s2 = "02/01/2015";

        System.out.println(new StringDateComparator("dd/MM/yyyy").compare(s1, s2));
    }

}

【讨论】:

    【解决方案2】:

    您需要以java.util.Date() 格式解析日期,然后进行比较。试试下面的示例代码:

    Comparator<Book> dateComparator = new Comparator<Book>() {
        @Override
        public int compare(Book o1, Book o2) {
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
            Date o1PublishDate = null;
            Date o2PublishDate = null;
            try {
                o1PublishDate = formatter.parse(o1.publishDate);
                o2PublishDate = formatter.parse(o2.publishDate);
            } catch (ParseException pe) {
                pe.printStackTrace();
            }
    
            return o1PublishDate.compareTo(o2PublishDate);
    
        }
    };
    

    【讨论】:

      【解决方案3】:

      如果您使用 Java7,我认为您的 publishDate 应该是 java.util.Date 对象,或者如果可以尝试使用新的 Java 8 Date API。但是,代码应该是这样的:

      Comparator<Book> titleComparator = new Comparator<Book>() {
          @Override
          public int compare(Book o1, Book o2) {
              return o1.title.compareTo(o2.title);
          }
      };
      Comparator<Book> ISBNComparator = new Comparator<Book>() {
      
          @Override
          public int compare(Book o1, Book o2) {
              return Integer.valueOf(o1.ISBN).compareTo(o2.ISBN);
          }
      };
      Comparator<Book> PublishComparator = new Comparator<Book>() {
      
          DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
          @Override
          public int compare(Book o1, Book o2) {
              Date d1 = format.parse(o1.publishDate);
              Date d2 = format.parse(o2.publishDate);
      
              return d1.compareTo(d2);
          }
      };
      public void sort(final String field, ArrayList<Book> BookList) {
      
          final Comparator<Book> comparator;
      
          if (field.equals("title")) {
              comparator = titleComparator;
          } else if (field.equals("ISBN")) {
              comparator = ISBNComparator;
          } else if (field.equals("publishDate")) {
              comparator = PublishComparator;
          } else {
              throw new IllegalArgumentException("Comparator not found for " + field);
          }
          Collections.sort(BookList, comparator);
      }
      

      【讨论】:

        猜你喜欢
        • 2022-12-05
        • 1970-01-01
        • 2012-08-22
        • 2012-10-19
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        • 1970-01-01
        相关资源
        最近更新 更多