2017-10-11 5 views
0

により、最新の三つの値を取得する:こんにちは、私は次のシナリオ持つ日付

final List<FirstDO> firstList; 
final List<SecondDO> secondList; 

DOさん(FirstDO、SecondDO)の両方がStringフィールドと日付フィールドを含み、他の :

を、私は2つのリストを持っています互いに異なるフィールドを有する。我々は、これらの値を持っていると仮定しましょう :

最初のリストは、これらの値を2 FirstD0-のオブジェクトが含まれています

First Object: 
    1. String field = "test" 
    2. Date field = 01.10.2017. 
    ..... 

Second Object: 
    1. String field = "test2" 
    2. Date field = 05.10.2017. 
    ..... 

第二のリストは、これらの値を2 SecondDO-のオブジェクトが含まれています

First Object: 
    1. String field = "test3" 
    2. Date field = 06.10.2017. 
    ..... 

Second Object: 
    1. String field = "test" 
    2. Date field = 07.10.2017. 
    ..... 

Third Object: 
    1. String field = "test4" 
    2. Date field = 02.10.2017. 
    ..... 

今私は、両方のリストを繰り返し、両方のリストから最新の3つのフィールド値を日付(降順)でソートする必要があります。つまり、これらはtest、test2、およびtest3になります。 2番目のリストでは、日付フィールド(07.10.2017)が "test4"(02.10.2017)よりも大きいので、 "test"を取る必要があることに気付いたかもしれません。

だから、私はいつも最大3つのフィールド値を日付(降順)でソートする必要があります。言い換えれば、私が両方のリストを結合するならば、私は最新の3つの値を取る必要があります。

私はこのようなTreeMapのを使用しようとしました:

 final Map<Date, String> myTreeMap= new TreeMap<Date, String>(); 

そしてただ、両方のリストを反復処理し、このマップに挿入し、日付が比較可能なインタフェースを実装しているので、それは、自動的に日付順によって必要がありますただし、同じ日付の値を置くと上書きされます。マップには重複キーがありません。この問題を解決するにはどうすればよいのか分かりません。

+0

「Date」クラスは** legacy ** nowですので、もう使用しないでください。代わりに、 'java.time'パッケージ内にある新しいAPIを使用してください。 – Zabuza

+0

'Date'クラスは、古くなった厄介な古い日時クラスの一部で、java.timeクラスに取って代わりました。時間帯のない日付のみの値の場合は、 'LocalDate'クラスを使用します。 –

答えて

0

Comparable

私はあなたのデータオブジェクトの両方が、彼らは両方の日付を持っており、このインターフェイスはjava.lang.Comparableを実装していることを示す共通のインタフェースを実装しています。

このようなものです。

interface hasDateAndData implements Comparable<hasDateAndData>{ 
    abstact public Date getDate(); 
    abstract public String getString(); 

    @Override 
    public int compareTo(hasDateAndData otherDD){ 
     int compareValue = getDate().compareTo(otherDD.getDate()); 
     if (compareValue == 0) { 
      //You need to define what order objects come in if there dates are equal 
     } else { 
      return compareValue; 
     } 
    } 
} 

その後、あなたは、このタイプの新しいリストにあなたのリストの両方からすべての項目を追加し、このリストをソートし、最初の3つの値を取ることができます。

List<hasDateAndData> combinedList = new ArrayList<hasDateAndData>(); 
combinedList.addAll(firstList); 
combinedList.addAll(secondList); 
combinedList.sort(); 
+0

私のオブジェクト(FirstDoとSecondDo)は似ていないと言いたかったので、これは互いに異なる他のフィールドも持っていることを意味しますが、それらは日付と文字列フィールドを持っています。 – NoName123

+1

私はあなたのオブジェクトがまったく似ているとは考えていませんでした。私はあなたの日付と文字列フィールドについて知っている共通のインターフェースを実装するようにそれらを変更することを提案しました。 – sn2k

+0

あなたの答えは大丈夫です。あなたのソリューションを分析しようとします。私は非常によく似たインターフェイスに精通していないので、私のfirstDoとSecondDoは、このインターフェイスとメソッドを実装し、ちょうど日付と文字列の値を返しますか? – NoName123

関連する問題