In Java, how to get list down the latest/first item of each group after grouping by field(/s)? e.g From the given list of medical records, how to retrieve the latest record of each patient.
Sample Data --------------------------------------------------------------------------- PatientName | ReportDate | ReadingNo | Measurement --------------------------------------------------------------------------- X | 2020-01-02 | 1 | 255 Y | 2020-01-02 | 1 | 250 X | 2020-01-02 | 2 | 266 Y | 2020-01-02 | 2 | 270 X | 2020-01-02 | 3 | 298 Y | 2020-01-02 | 3 | 259 X | 2020-01-02 | 4 | 280 Y | 2020-01-02 | 4 | 285 X | 2020-01-03 | 1 | 260 Y | 2020-01-03 | 1 | 265 X | 2020-01-03 | 2 | 280 Y | 2020-01-03 | 2 | 260 X | 2020-01-03 | 3 | 285 Y | 2020-01-03 | 3 | 290 X | 2020-01-03 | 4 | 290 Y | 2020-01-03 | 4 | 280 --------------------------------------------------------------------------- Expected result --------------------------------------------------------------------------- PatientName | ReportDate | ReadingNo | Measurement --------------------------------------------------------------------------- X | 2020-01-03 | 4 | 290 Y | 2020-01-03 | 4 | 280 ---------------------------------------------------------------------------
I can do it C# as below. Any one can help to translate it in Java?
using System.Collections.Generic; using System.Linq; public class Program { public static void Main() { Console.WriteLine("---------------------------------------------------------------------------"); Console.WriteLine(String.Format("{0} |\t{1}\t| {2} |\t{3}", "PatientName", "ReportDate", "ReadingNo", "Measurement")); Console.WriteLine("---------------------------------------------------------------------------"); List lst = new List { new Patient(){Name="X", ReportDate="2020-01-02", ReadingNo=1, Measurement=255 }, new Patient(){Name="Y", ReportDate="2020-01-02", ReadingNo=1, Measurement=250 }, new Patient(){Name="X", ReportDate="2020-01-02", ReadingNo=2, Measurement=266 }, new Patient(){Name="Y", ReportDate="2020-01-02", ReadingNo=2, Measurement=270 }, new Patient(){Name="X", ReportDate="2020-01-02", ReadingNo=3, Measurement=298 }, new Patient(){Name="Y", ReportDate="2020-01-02", ReadingNo=3, Measurement=259 }, new Patient(){Name="X", ReportDate="2020-01-02", ReadingNo=4, Measurement=280 }, new Patient(){Name="Y", ReportDate="2020-01-02", ReadingNo=4, Measurement=285 }, new Patient(){Name="X", ReportDate="2020-01-03", ReadingNo=1, Measurement=260 }, new Patient(){Name="Y", ReportDate="2020-01-03", ReadingNo=1, Measurement=265 }, new Patient(){Name="X", ReportDate="2020-01-03", ReadingNo=2, Measurement=280 }, new Patient(){Name="Y", ReportDate="2020-01-03", ReadingNo=2, Measurement=260 }, new Patient(){Name="X", ReportDate="2020-01-03", ReadingNo=3, Measurement=285 }, new Patient(){Name="Y", ReportDate="2020-01-03", ReadingNo=3, Measurement=290 }, new Patient(){Name="X", ReportDate="2020-01-03", ReadingNo=4, Measurement=290 }, new Patient(){Name="Y", ReportDate="2020-01-03", ReadingNo=4, Measurement=280 } }; lst.ForEach(p=>{ Console.WriteLine(p.toString()); }); Console.WriteLine("---------------------------------------------------------------------------"); var lstLatest = from p in lst group p by p.Name into g select g.OrderByDescending(p => p.ReportDate).ThenByDescending(p=>p.ReadingNo).ToList(); foreach(var p in lstLatest) { Console.WriteLine(p.First().toString()); } } } public class Patient { public string Name { get; set;} public string ReportDate {get;set;} public int ReadingNo {get;set;} public int Measurement {get;set;} public string toString() { return String.Format("{0}\t\t\t|\t{1}\t|\t{2} \t|\t{3}", this.Name, this.ReportDate, this.ReadingNo, this.Measurement); } }