9

小さな問題があります。すべての要素が日付のようなものである ArrayList listOfSData があります。次に例を示します。

[2012 年 3 月 30 日、2013 年 3 月 28 日、2012 年 3 月 31 日、2012 年 4 月 2 日、...]

ここで、このリストをどのように並べ替えることができるか疑問に思っていました。つまり、これに並べ替えたい

[2013 年 3 月 28 日、2012 年 3 月 30 日、2012 年 3 月 31 日、2012 年 4 月 2 日など]。

このリストには文字列値が必要です。このリストを並べ替えるにはどうすればよいですか? どうすればいいのかわからないので助けてください。

4

5 に答える 5

35

Comparator<String>文字列を比較する前に、文字列を日付に変換するオブジェクトを実装する必要があります。SimpleDateFormatオブジェクトを使用して変換を実行できます。

何かのようなもの:

class StringDateComparator implements Comparator<String>
{
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
    public int compare(String lhs, String rhs)
    {
        return dateFormat.parse(lhs).compareTo(dateFormat.parse(rhs));
    }
}

Collections.sort(arrayList, new StringDateComparator());
于 2013-03-17T15:56:20.753 に答える
11

ここにあなたの入力に基づく小さな例があります。これは数行少なくてもできますが、こちらの方が理解しやすいと思いました。それが役に立てば幸い。

List<String> values = new ArrayList<String>();
     values.add("30-03-2012");
     values.add("28-03-2013");
     values.add("31-03-2012");
     Collections.sort(values, new Comparator<String>() {

        @Override
        public int compare(String arg0, String arg1) {
             SimpleDateFormat format = new SimpleDateFormat(
                        "dd-MM-yyyy");
             int compareResult = 0;
             try {
                Date arg0Date = format.parse(arg0);
                Date arg1Date = format.parse(arg1);
                compareResult = arg0Date.compareTo(arg1Date);
            } catch (ParseException e) {
                e.printStackTrace();
                compareResult = arg0.compareTo(arg1);
            }
            return compareResult;
        }
     });
于 2013-03-17T16:13:38.593 に答える
2

最初はすでに与えられた答えが書かれていますが、その決定はそれほど速くはありません.

標準の Java Collections.sort は timsort を使用します。平均的なケースでは、O(n*log(n)) の比較が必要なため、カスタム コンパレーターは O(n*log(n)) 回呼び出します。

パフォーマンスが重要な場合、たとえば大規模な配列がある場合は、次のことができます。

  1. 文字列日付を int または long タイムスタンプに変換します。これには O(n) 操作が必要です。そして、long または integer の配列をソートするだけです。2 つのアトミック int の比較は、どの比較器よりもはるかに高速です。

  2. このソートの速度を上げたい場合は、基数ソート ( http://en.wikipedia.org/wiki/Radix_sort ) を使用できます。多くのメモリを消費しますが、最適化できます。ご覧のとおり、時刻を指定する必要はありません。したがって、値の範囲はそれほど大きくありません。最初のパス (O(n)) で、日付を整数値に変換できます。次の仮定があります。

    • 1970 01 01 は開始日 (または、わかっている場合はより具体的な時間) であり、1 のようにエンコードします
    • 最大日付は 2170 01 01 です
    • すべての月は 31 日です。したがって、年間 31*12 = 372 の値が得られます。また、基数ソートを使用して整数の配列をソートすることもできます。200 年の範囲で値を並べ替えるには、マージ並べ替え配列に 200 * 372 * 4 = 297600 バイトしかかかりませんが、O(2 * n) の複雑さが得られます。
于 2013-03-17T16:47:40.500 に答える
0

これは、オブジェクトの配列を時間パラメーターで並べ替えるために私が書いたメソッドです。これは、毎回 2 つの String 時間を比較することによって行われます。これは、パターン パラメーターを「dd-MM-yyyy」に変更することで、日付の比較に合わせて簡単に調整できます。

int repositorySize = tempTasksRepository.size();
            int initialRepositorySize = repositorySize;
            Task soonTask = tempTasksRepository.get(0);
            String pattern = "HH:mm";
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

            for (int i= 0; i < initialRepositorySize; i++)
            {
                for (int j= 0; j < repositorySize; j++)
                {
                    Task tempTask = tempTasksRepository.get(j);

                    try 
                    {
                        Date taskTime = simpleDateFormat.parse(tempTask.getTime());
                        Date soonTaskTime = simpleDateFormat.parse(soonTask.getTime());

                        // Outputs -1 as date1 is before date2
                        if (taskTime.compareTo(soonTaskTime) == -1)
                        {
                             soonTask = tempTask;
                        }
                    } 
                    catch (ParseException e)
                    {
                        Log.e(TAG, "error while parsing time in time sort: " + e.toString());
                    }
                }
                tasksRepository.add(soonTask);
                tempTasksRepository.remove(soonTask);
                if ( tempTasksRepository.size() > 0 )
                {
                    soonTask = tempTasksRepository.get(0);
                }
                repositorySize--;
于 2013-03-17T16:00:09.487 に答える
0

「d-MM-yyyy」パターンでSimpleDateFormatを使用してみてください: 1. SimpleDateFormat を作成します 2. listOfSData 文字列配列を解析して java.util.Date[] に変換します 3. Arrays.sort を使用して日付配列を並べ替えます 4. Date[] を文字列配列に変換します同じ SimpleDateFormat を使用する

于 2013-03-17T16:00:42.450 に答える