-1

(Type Date)MyObject.getDate()でArrayListをソートしようとしています

私のフォーマットは、SimpleDateFormatbydd-mm-yyyyでフォーマットされています。カスタムコンパレータを使用してリストを並べ替えています。私はCollections.sort(produuctList、new CustomComparator())を使用しています

問題私のソートされたリストはddのみであり、dd-mm-yyyyではありません。

何か案は?

public class Product
{
    private String productName; 
    private Date boughtOn;
    private Date useBy; 
    private double boughtAt; 
    private long quantity; 
    private static DateFormat dateFormat;


    public Date getUseBy()
    {
        return useBy;
    }
    public void setUseBy(Date useBy)
    {
        this.useBy = useBy;
    }
}

public static Date rtnDate(String dateStr, int currentLineCount)
    {
        SimpleDateFormat df = new SimpleDateFormat("dd-mm-yyyy");
        try
        {   
            Date date = df.parse(dateStr);
            return date;
        }
        catch (ParseException e)
        {
            productParsingErrorMessages.add("Date parse exception: " + e + "on line " + currentLineCount);
            return null;
        }

//      DateFormat formatter = new SimpleDateFormat("dd-mm-yyyy");
//      Date date2 = (Date)formatter.parse(dateStr);
    }
System.out.println("Product list - BEFORE sorting by UseBy");
printInventory(produuctList);

Collections.sort(produuctList, new CustomComparator());

System.out.println("Product list - AFTER sorting by UseBy");
printInventory(produuctList);
public class CustomComparator implements Comparator<Product>
{
    @Override
    public int compare(Product o1, Product o2)
    {
        return o1.getUseBy().compareTo(o2.getUseBy());
    }
}

製品リスト-UseByで並べ替える前

製品名:sugar UseBy
:2012年12月12日
製品名:sugar UseBy:2012年1月10日製品名:sugar UseBy:2012年4月16日
製品名:sugar UseBy:2012年1月30日
製品名:sugar UseBy: 2012年4月25日
製品名:sugar UseBy:2012年3月4日
製品名:sugar UseBy:2012年8月4日

製品リスト-UseByによるソート後

製品名:sugar UseBy:2012年1月10日
製品名:sugar UseBy:2012年3月4日
製品名:sugar UseBy:2012年8月4日製品名:sugar UseBy:2012年12月12日
製品
名:sugar UseBy: 2012年4月16日
製品名:砂糖UseBy:2012年4月25日
製品名:砂糖UseBy:2012年1月30日

4

2 に答える 2

1

フォーマット文字列が正しくコピーされている場合、SimpleDateFormatは間違っています。数分ではなく数か月に関心があるので、dd-MM-yyyyそうではありません。dd-mm-yyyy

あなたが持っている:

public static Date rtnDate(String dateStr, int currentLineCount)
{
    SimpleDateFormat df = new SimpleDateFormat("dd-mm-yyyy");

使用する必要がある場合:

public static Date rtnDate(String dateStr, int currentLineCount)
{
    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");

これはすべてを説明します。

于 2012-05-27T03:36:01.833 に答える
0

私はあなたがjava.lang.Stringsではなくjava.util.Datesを比較していると約90%確信しています。あなたが言及した日付形式を考えると、それは明らかに最初にすべての日を一緒にソートします。たとえば、1年間、リストは次のように始まります。

01-01-2012 (1 Jan)
01-02-2012 (1 Feb)
01-03-2012 (1 Mar)

文字列表現ではなく、Dateオブジェクトを使用して比較します。

PS画像はコードではありません。あなたの質問にあなたのコードを入れてください。

更新:投稿したコードが期待どおりに機能することの証明:

import java.text.DateFormat;
import java.util.*;

public class DateComparators {
    public static void main(String[] args) {
        List<Product> productList = Arrays.asList(
                new Product(new Date(2012 - 1900, 5, 1)), // 1 Jun 2012
                new Product(new Date(2012 - 1900, 1, 1)), // 1 Feb 2012
                new Product(new Date(2012 - 1900, 2, 15)), // 15 Mar 2012
                new Product(new Date(2012 - 1900, 0, 2)), // 2 Jan 2012
                new Product(new Date(2012 - 1900, 1, 2)), // 2 Feb 2012
                new Product(new Date(2012 - 1900, 0, 1)) // 1 Jan 2012
        );
        Collections.sort(productList, new CustomComparator());
        System.out.println(productList);
    }

    static class CustomComparator implements Comparator<Product> {
        @Override
        public int compare(Product o1, Product o2) {
            return o1.getUseBy().compareTo(o2.getUseBy());
        }
    }

    static class Product {
        private String productName; // sauce pan
        private Date boughtOn; // 4-5-2012
        private Date useBy; // 4-5-2012
        private double boughtAt; // $4.05
        private long quantity; // 9
        private static DateFormat dateFormat;

        Product(Date useBy) {
            this.useBy = useBy;
        }

        public Date getUseBy() {
            return useBy;
        }

        public void setUseBy(Date useBy) {
            this.useBy = useBy;
        }

        @Override
        public String toString() {
            return "\nuseBy=" + useBy;
        }
    }
}

出力:

[
useBy=Sun Jan 01 00:00:00 CST 2012, 
useBy=Mon Jan 02 00:00:00 CST 2012, 
useBy=Wed Feb 01 00:00:00 CST 2012, 
useBy=Thu Feb 02 00:00:00 CST 2012, 
useBy=Thu Mar 15 00:00:00 CDT 2012, 
useBy=Fri Jun 01 00:00:00 CDT 2012]

したがって、あなたは私たちにすべてを見せたわけではありません。問題はあなたが省略したものにあります。

于 2012-05-27T03:23:01.377 に答える