2017-07-11 10 views
-3

私が読んでいるいくつかのコンセプトを組み合わせなければならないと思っている問題がありますが、それらを組み合わせる方法を見つけることができないか、または最も効率的なものを見つけることができません。ここに私の状況があります:オブジェクトのリストを反復処理し、フィールドを変換し、比較し、そのフィールドでソートする方法は?

私はマイクロサービスで作業しています。これは、これが非常に特殊な理由です。基本的に、別のサービスからボリュームオブジェクトのリストを取得しています。ボリュームオブジェクトには、String型、String型の日付(実際には "HH:mm"の形式で時刻を表し、命名規則にデータモデラーを責める)、およびint closeという3つのフィールドがあります。

私がやっていることは、オブジェクトのリストを取得して日付(時間)でソートし、同じ日付(時間)を含むオブジェクトの新しいリストを作成し、それに基づいて異なるフィールド値を持つことです私がやっている計算の時間でソートするには、時間フィールドをDateオブジェクトに変換して比較する必要があると思います。私はオブジェクトを反復処理し、変換されたフィールドを比較する方法を苦労しています。私が感じるものは、正しい道に私を置いた:How to sort a List<Object> alphabetically using Object name field

しかし、私はそれを働かせるように見えることはできません。

volumeResources.sort(volumeResources, new Comparator<VolumeResource>(){ 
     @Override 
     public int compare(VolumeResource v1, VolumeResource v2) { 
      SimpleDateFormat format = new SimpleDateFormat("HH:mm"); 
      try { 
       Date d1 = format.parse(v1.getDate()); 
       Date d2 = format.parse(v2.getDate()); 
      } catch (ParseException e) { 
       log.error("Error in parsing string to date. ", e); 
      } 
      return d1.compareTo(d2); 
     } 
    }); 

今すぐ右のバット、私はVolumeResourcesのv1とv2を比較し始めたが、代わりに最後に日付を比較してみましたので、これは正しくないでなければならないことを知っている:ここに私のコードです。上記のreturn文の代わりに、私はまた、以下のいずれかを試してみましたが、それは実際にDateオブジェクトにフォーマットされたオブジェクトを設定していないので、私はそれが常に動作するとは思わない:

return format.parse(v1.getDate()).compareTo(format.parse(v2.getDate())); 

だからそれはどこだI失われた。これは擬似コードで説明するとかなり簡単な必要性のように思えますが、機能的に機能させる方法を理解できないようです。私がこれから簡単に必要とする他のフィールドを埋める方法があれば、ボーナスポイント。ラムダを使用するか、これを効率的にするための二重のボーナスポイント。

ありがとうございました。

+0

_exactly_はあなたの問題ですか?あなたのプログラムはどのように期待どおりに実行されませんか? – Marvin

+0

それはコンパイルさえしますか? – assylias

+0

@Marvinこの主な問題は、オブジェクトのリストを時間文字列でソートする方法を理解しようとしています。 – Crislips

答えて

1

:ラムダを使用して

 return v1.getDate().compareTo(v2.getDate(); 

(文字列として表される)時間によってソートは、このようになります。

volumeResources.sort(new Comparator<VolumeResource>() { 
     @Override 
     public int compare(VolumeResource v1, VolumeResource v2) { 
      return v1.getDate().compareTo(v2.getDate()); 
     } 
    }); 

のJava 8先立ち、それはのようになりますvolumeResourcesは人口可変List(ないnull)であり、すべてのエントリが十分に形成され、時間とともに適切に移入日付フィールド(スペースなし、タブ、または欠落先頭を持っていると仮定すると

volumeResources.sort((v1, v2) -> v1.getDate().compareTo(v2.getDate())); 

:ラムダを使用

Collections.sort(volumeResources, new Comparator<VolumeResource>() { 
     @Override 
     public int compare(VolumeResource v1, VolumeResource v2) { 
      return v1.getDate().compareTo(v2.getDate()); 
     } 
    }); 

0)

説明

のあなたの定義によると、日付フィールドは自然に文字列としてソート可能ですので、それらをJavaのDateクラスに変換する必要はありません。

あなたの例では、それがユーティリティクラスCollectionsを使用することによって、従来のJava 8にするために使用方法の方法でListインタフェースで定義されるJava 8 sortメソッドを使用して問題を持っている - これは間違っている、あなたが最初のようにコレクションを提供する必要はありません。パラメータ。

+0

ありがとうございました。私はジャノスに言いました。もう一つ注意が必要です。これは私がまだやったことのないものでしたが、一度考えてみると分かりました。時間が「23:30」、「24:00」、「24:30:」、「01:00」、「01:30」、「02:00」になるとします。これは深夜過ぎを意味し、その後に来る必要があります。これをどうやって説明できますか? – Crislips

+0

@クリスリップスは、正しく定義された時間と誤って定義された時間の例と、誤った時間のエントリーをソートされたリストに入れるべきあなたの期待を混在させることができますか? –

+0

私があなたを正しく理解すれば、ここに私の言いたいことがあります。私は、数字だけでなく、発生順にこれらの時間を見る必要があります。ですから、時間が深夜を過ぎ、時間が順番に増える@Vladimir Lの状況があるとしましょう。 「23:30」、「24:00」、「24:30:」、「01:00」、「01:30」、「02:00」のようにソートされるオブジェクトのリストが必要です。 00 "となる。しかし、現在のコードでは、 "01:00"、 "01:30"、 "02:00"、 "23:30"、 "24:00"、 "24:30:" – Crislips

1

Javaの日付には年、月、日が必要です。 ただし、そのような値はありません。HH:mm(時、分)のみです。 日付の使用はここでは適切ではありません。 (これらの値を「日付」と呼んでも変わっていないので、名前を変更することをお勧めします)

正常に整理するには、整形式のHH:mmをアルファベット順に並べ替えることができます。したがって、入力時間が\d\d:\d\dのパターンになるようにするだけです。たとえば、9:15の場合は、左側に詰め物0を追加します。このような何か:あなたはそれに応じて実装するため

volumeResources.sort(volumeResources, new Comparator<VolumeResource>() { 
    @Override 
    public int compare(VolumeResource v1, VolumeResource v2) { 
     return sanitized(v1.getDate()).compareTo(sanitized(v2.getDate()); 
    } 
}); 

sanitized方法があります。 値が正しい形式に既にある場合は、タイプStringの、あなたはこれらの呼び出しをドロップすることができますし、に簡素化:あなたは上記のJava 8とを使用している場合は

volumeResources.sort(volumeResources, (v1, v2) -> sanitized(v1.getDate()).compareTo(sanitized(v2.getDate())); 
+0

アドバイスをいただきありがとうございます。データの慣習は私によって決定されたものではなく、データモデラーとの戦いに値するものではありません。私は日付が不十分に選ばれた名前であることを知っています。 私はこの状況でLocalDateTimeを代わりに使うことができたと思いますが、あなたが書いたことは間違いなくきれいです。 私はもう一度注意しなければならないことがあります。これは私がまだ手に入らなかったものですが、一度見ていたら私はこれを理解しました。時間が「23:30」、「24:00」、「24:30:」、「01:00」、「01:30」、「02:00」になるとします。これは深夜過ぎを意味し、その後に来る必要があります。これをどうやって説明できますか? – Crislips

+0

私が知る限り、それはこれのための要件の範囲です。私は私の元の答えにできるだけ簡潔にしようとしましたが、それを含めることを完全に忘れました。しかし、最終回帰の時代には、その時代にとどまる必要があります。 – Crislips

+0

@クリスプスすべての重要な要件が質問に記載されているはずです。理想的には入力例と予想出力、特に扱いにくいコーナーケースを含む。それを忘れた場合は、受け取った回答を変更してから変更するのが遅すぎます。この場合、このサイトを使用する正しい方法は、新しい質問をすることです。次回は重要な詳細をすべて含めてください。 – janos

関連する問題