web-dev-qa-db-ja.com

ArrayList内のオブジェクトを日付け順に並べる

私が見つけるすべての例はアルファベット順にこれを行うことについてです、私は私の要素を日付順にソートする必要があります。

My ArrayListには、データメンバーの1つがDateTimeオブジェクトであるオブジェクトが含まれています。 DateTimeに私は関数を呼び出すことができます:

lt() // less-than
lteq() // less-than-or-equal-to

それを比較するために、私は以下のようなことができます。

if(myList.get(i).lt(myList.get(j))){
    // ...
}

Ifブロック内で何をすればいいですか?

125
user393964

あなたのオブジェクトを同等にすることができます:

public static class MyObject implements Comparable<MyObject> {

  private Date dateTime;

  public Date getDateTime() {
    return dateTime;
  }

  public void setDateTime(Date datetime) {
    this.dateTime = datetime;
  }

  @Override
  public int compareTo(MyObject o) {
    return getDateTime().compareTo(o.getDateTime());
  }
}

そして、あなたはそれを次のように呼び出してソートします。

Collections.sort(myList);

ただし、いくつかの異なるプロパティで並べ替える場合のように、モデルを変更したくない場合があります。その場合は、その場でコンパレータを作成できます。

Collections.sort(myList, new Comparator<MyObject>() {
  public int compare(MyObject o1, MyObject o2) {
      return o1.getDateTime().compareTo(o2.getDateTime());
  }
});

ただし、上記の説明は、比較時にdateTimeがnullではないことが確実な場合にのみ機能します。 NullPointerExceptionsを避けるためにnullも扱うのが賢明です。

public static class MyObject implements Comparable<MyObject> {

  private Date dateTime;

  public Date getDateTime() {
    return dateTime;
  }

  public void setDateTime(Date datetime) {
    this.dateTime = datetime;
  }

  @Override
  public int compareTo(MyObject o) {
    if (getDateTime() == null || o.getDateTime() == null)
      return 0;
    return getDateTime().compareTo(o.getDateTime());
  }
}

または2番目の例では:

Collections.sort(myList, new Comparator<MyObject>() {
  public int compare(MyObject o1, MyObject o2) {
      if (o1.getDateTime() == null || o2.getDateTime() == null)
        return 0;
      return o1.getDateTime().compareTo(o2.getDateTime());
  }
});
376
Domchi

Java 8以降、 List インタフェースは sort メソッドを提供しています。 λ 式と組み合わせると、最も簡単な解決策は次のようになります。

// sort DateTime typed list
list.sort((d1,d2) -> d1.compareTo(d2));
// or an object which has an DateTime attribute
list.sort((o1,o2) -> o1.getDateTime().compareTo(o2.getDateTime()));
// or like mentioned by Tunaki
list.sort(Comparator.comparing(o -> o.getDateTime()))
45
Paul Wasilewski

Collections.sortメソッドを使用できます。これは静的な方法です。リストとコンパレータを渡します。それはリストの上で修正された併合アルゴリズムを使用します。そのため、ペア比較を行うにはコンパレータを渡す必要があります。

Collections.sort(myList, new Comparator<MyObject> {
   public int compare(MyObject o1, MyObject o2) {
      DateTime a = o1.getDateTime();
      DateTime b = o2.getDateTime();
      if (a.lt(b)) 
        return -1;
      else if (a.lteq(b)) // it's equals
         return 0;
      else
         return 1;
   }
});

MyListが比較可能な型(Comparableインタフェースを実装するもの)(Date、Integer、Stringなど)の場合は、コンパレータを省略して自然順序付けを使用することに注意してください。

18
helios
list.sort(Comparator.comparing(o -> o.getDateTime()));

Java 8 lambdaを使ったTunakiの私見最高の答え

9
Stimpson Cat

MyObjectメンバーにgetDateTime()メソッドを持つDateTimeがあるとすると、ArrayList要素を含むMyObjectを次のようなDateTimeオブジェクトでソートできます。

Collections.sort(myList, new Comparator<MyObject>() {
    public int compare(MyObject o1, MyObject o2) {
        return o1.getDateTime().lt(o2.getDateTime()) ? -1 : 1;
    }
});
7
WhiteFang34

これが私が解決した方法です:

Collections.sort(MyList, (o1, o2) -> o1.getLastModified().compareTo(o2.getLastModified()));

お役に立てば幸いです。

4
Igor Escobar

Java 1.8の導入により、ストリームはこの種の問題を解決するのに非常に役立ちます。

Comparator <DateTime> myComparator = (arg1, arg2) 
                -> {
                    if(arg1.lt(arg2)) 
                       return -1;
                    else if (arg1.lteq(arg2))
                       return 0;
                    else
                       return 1;
                   };

ArrayList<DateTime> sortedList = myList
                   .stream()
                   .sorted(myComparator)
                   .collect(Collectors.toCollection(ArrayList::new));
2
Tinki

ここに挙げたすべての答えは、単純な問題では不要なほど複雑であることがわかりました(少なくとも私は経験の浅いJava開発者にとって)。私は同様の問題を抱えていて、この(そして他の)解決策を試しました、そしてそれらがポインターを提供したけれども、私が上で述べたように私が見つけた初心者のために。私の解決策は、DateがObjectのどこにあるかによって異なります。この場合、DateはObject []の最初の要素です。dataVectorは、Objectsを含むArrayListです。

Collections.sort(dataVector, new Comparator<Object[]>() {
    public int compare(Object[] o1, Object[] o2) {
        return ((Date)o1[0]).compareTo(((Date)o2[0]));
    }
});
1
Nepaluz

これは古い応答かもしれませんが、この投稿の例を使用して、リスト内の1つのオブジェクト、タイムスタンプであるHashMap<String, String>ArrayListをソートするコンパレータを作成しました。

これらのオブジェクトがあります。

ArrayList<Map<String, String>> alList = new ArrayList<Map<String, String>>();

マップオブジェクトは次のとおりです。

Map<String, Object> map = new HashMap<>();
        // of course this is the actual formatted date below in the timestamp
        map.put("timestamp", "MM/dd/yyyy HH:mm:ss"); 
        map.put("item1", "my text goes here");
        map.put("item2", "my text goes here");

そのマッピングは、ループ内でalList.add(map)関数を使用して、私のすべてのオブジェクトを配列リストにロードするために使用するものです。

今、私は私自身のコンパレータを作成しました:

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import Java.util.ArrayList;
import Java.util.Collections;
import Java.util.Comparator;
import Java.util.HashMap;
import Java.util.Map;

 public class DateSorter implements Comparator {
     public int compare(Object firstObjToCompare, Object secondObjToCompare) {
    String firstDateString = ((HashMap<String, String>) firstObjToCompare).get("timestamp");
    String secondDateString = ((HashMap<String, String>) secondObjToCompare).get("timestamp");

    if (secondDateString == null || firstDateString == null) {
        return 0;
    }

    // Convert to Dates
    DateTimeFormatter dtf = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss");
    DateTime firstDate = dtf.parseDateTime(firstDateString);
    DateTime secondDate = dtf.parseDateTime(secondDateString);

    if (firstDate.isAfter(secondDate)) return -1;
    else if (firstDate.isBefore(secondDate)) return 1;
    else return 0;
    }
}

配列上でいつでもComparatorを呼び出すことができ、配列がソートされ、位置0(リストの先頭)にある最新のタイムスタンプとリストの末尾にある最も早いタイムスタンプが表示されます。新しい投稿は基本的にトップに置かれます。

Collections.sort(alList, new DateSorter());

これは誰かを手助けするかもしれません、それが私がそれを投稿した理由です。 compare()関数内のreturnステートメントを考慮に入れてください。結果は3種類あります。等しい場合は0を返し、最初の日付が2番目の日付より前の場合は> 0を返し、最初の日付が2番目の日付より後の場合は<0を返します。リストを逆にしたい場合は、単にこれら2つのreturn文を切り替えてください。単純=]

0
Brandon

DateクラスはすでにComparatorインタフェースを実装しています。以下のクラスがあるとします。

public class A {

    private Date dateTime;

    public Date getDateTime() {
        return dateTime;
    }

    .... other variables

}

AオブジェクトのリストがList<A> aListであるとしましょう。Java8のストリームAPI(下記のスニペット)で簡単にソートできます。

import Java.util.Comparator;
import Java.util.stream.Collectors;

...

aList = aList.stream()
        .sorted(Comparator.comparing(A::getDateTime))
        .collect(Collectors.toList())
0
Anthony Anyanwu

ArrayList In引数を渡します。

    private static void order(ArrayList<Object> list) {

    Collections.sort(list, new Comparator() {

        public int compare(Object o2, Object o1) {

            String x1 =  o1.Date;
            String x2 =  o2.Date;

                return  x1.compareTo(x2);

        }
    });
}
0
Senghani Maulik

日付がソートされているかどうかを確認するには、以下の方法を使用します。

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy");

boolean  decendingOrder = true;
    for(int index=0;index<date.size() - 1; index++) {
        if(simpleDateFormat.parse(date.get(index)).getTime() < simpleDateFormat.parse(date.get(index+1)).getTime()) {
            decendingOrder = false;
            break;
        }
    }
    if(decendingOrder) {
        System.out.println("Date are in Decending Order");
    }else {
        System.out.println("Date not in Decending Order");
    }       
}   
0
Vikas Rathour