10

このコレクションをCollection basics = periodic.getGeneratedBasic(); 反復処理してすべてのオブジェクトを取得してキャストすると、すべてのオブジェクトの日付を抽出できます。この時点で、このオブジェクトのコレクションでどれが小さくて最大の日付であるかを確認したいと思います。

誰もそれを行う方法を知っていますか?

Date max;
Date min;
for(Object o:basics){
      Basic b = (Basic) o;
      Date temp;
      if(b.State=='U'){
           basicAList.add(ba);
           dateCollection.add(b.firstDateTime);
           temp= ;
           if(b.firstDateTime <)
     }
  }
4

7 に答える 7

19

Java 8 では、次のことができます。

final Date maxDate = dates.stream()
    .max(Date::compareTo)
    .get();
于 2015-09-18T06:08:47.780 に答える
13

これは古典的な最小と最大の問題です。オブジェクトが日付、文字列、または数値であっても。重要なのは、それらが比較可能であることです。

ソートしてから最大/最小を取る

最も簡単な方法は、他の人の答えのように、Java組み込みのSortメソッドでコレクションをソートします。次に、最初と最後の要素を最小/最大オブジェクトとして取得します。ただし、線形時間の問題は になりO(n)ますO(nlgn)。パフォーマンスの問題があなたが考えているものではない場合。私の残りのテキストを読むのをスキップできます。そして、@ Quoiの回答に賛成します。

線形時間の簡単な方法:

2 つの変数の最小値と最大値を保持してから、コレクション内の各要素に移動します。現在の最小値と最大値と比較して、正しい値を取得します。最後まで。

線形時間による最適化された方法

上記の方法は簡単ですが、より多くの比較が行われ(2n)ます。少し最適化できます。上記と同じように、最小および最大 2 つの変数があります。ループでは、単一ではなく要素のペアを取ります。最初にペアの 2 つの要素を比較します。大きい方を最大変数と比較し、小さい方を最小変数と比較します。3(n/2)あとは比較するだけです。

それが役に立てば幸い

編集

コードを書くのはそれほど難しくないと思います。Quoi が示唆したように、コードで答えを完成させることができれば、それらを追加します。

この例では、int 配列を使用していることに注意してください。基本的には Date オブジェクトと同じです。コードは、単体テスト メソッドで記述されます。そして、上記のアイデアを明確に説明しようとしているので、長く見えます。

@Test
    public void testx() {
        final int size = 300000;
        final int[] array = new int[size];
        final Random random = new Random();
        // fill a huge array for testing
        for (int i = 0; i < array.length; i++) {
            array[i] = random.nextInt();
        }

        int min1 = array[0], max1 = array[1], cmp1 = 0;
        int min2 = array[0], max2 = array[1], cmp2 = 0;

        for (int i = 2; i < array.length; i++) {
            min1 = array[i] < min1 ? array[i] : min1;
            cmp1++;
            max1 = array[i] > max1 ? array[i] : max1;
            cmp1++;
        }

        LOG.debug("linear time to find Max & Min simultaneously");
        LOG.debug("Size: {}", size);
        LOG.debug("Max : {}", max1);
        LOG.debug("Min : {}", min1);
        LOG.debug("Total comparisons : {}", cmp1);

        // optimized linear
        int bigger, smaller;
        final boolean odd = array.length % 2 == 1;
        final int till = odd ? array.length - 1 : array.length;
        for (int i = 2; i < till; i += 2) {

            if (array[i] >= array[i + 1]) {
                bigger = array[i];
                smaller = array[i + 1];
            } else {
                bigger = array[i + 1];
                smaller = array[i];
            }
            cmp2++;
            min2 = smaller < min2 ? smaller : min2;
            cmp2++;
            max2 = bigger > max2 ? bigger : max2;
            cmp2++;
        }
        if (odd) {
            min2 = array[size - 1] < min2 ? array[size - 1] : min2;
            max2 = array[size - 1] > max2 ? array[size - 1] : max2;
        }
        LOG.debug("====================================================");
        LOG.debug("optimized linear time to find Max & Min simultaneously");
        LOG.debug("Size: {}", size);
        LOG.debug("Max : {}", max2);
        LOG.debug("Min : {}", min2);
        LOG.debug("Total comparisons : {}", cmp2);
    }

出力

DEBUG:  linear time to find Max & Min simultaneously
DEBUG:  Size: 300000
DEBUG:  Max : 2147475519
DEBUG:  Min : -2147446732
DEBUG:  Total comparisons : 599996
DEBUG:  ====================================================
DEBUG:  optimized linear time to find Max & Min simultaneously
DEBUG:  Size: 300000
DEBUG:  Max : 2147475519
DEBUG:  Min : -2147446732
DEBUG:  Total comparisons : 449997
于 2012-10-18T09:48:29.060 に答える
12

Collections.sort()を使用して、最初/最後のエントリを取得しないのはなぜですか? 自然順序付けを使用するか、独自のComparatorを指定できます。

これにより、コレクションがその場でソートされることに注意してください。新しいソートされたコレクションは提供されません。

于 2012-10-18T09:33:38.193 に答える
7

Dateはであるため、次を使用しComparableて 2 つの を比較できます。DatecompareTo()

dateOne.compareTo(dateTwo);

戻り値: 引数 Date がこの Date と等しい場合は値 0。この Date が Date 引数より前の場合は 0 未満の値。この Date が Date 引数より後の場合は 0 より大きい値。

(O(n logn))で全体Collectionをソートすることもできます。Collections.sort()

Collections.sort(dateCollection);

または、 (両方とも線形時間 O(n)) で最大値とCollections.max()最小値を取得します。Collections.min()

于 2012-10-18T09:32:34.953 に答える
3
Date max = new Date(0);
Date min = new Date(0);
for(Object o:basics){
    Basic b = (Basic) o;
    if(b.State=='U'){
        basicAList.add(ba);
        dateCollection.add(b.firstDateTime);
        if(min.compareTo(b.firstDateTime) > 0) min = b.firstDateTime;
        else if(max.compareTo(b.firstDateTime) < 0) max = b.firstDateTime;
    }
}
于 2012-10-18T09:36:32.963 に答える
1

日付に基づいてコレクションを並べ替えて取得できます。昇順の場合、最小の日付が最初に、最大の日付が最後に取得されます。降順でソートすると、最大の日付が一番上に、最小の日付が最後に取得されます。

于 2012-10-18T09:33:10.407 に答える
1

この以前の SO 投稿をご覧ください。オブジェクトを日付で並べ替えてから、コレクション内の最初と最後のアイテムを選択できます。

于 2012-10-18T09:33:40.683 に答える