我建议您创建一个自定义类型,例如Visit 如下图所示,以结构化的方式处理记录。您可以use the standard Java I/O library 或一些专门的库从文件中读取记录并填充Visit 对象。为此,我建议您使用流行的opencsv library。无论您以何种方式填充Visit 对象并创建这些对象的List<Visit>,您都可以使用Java Stream API 来处理该列表。为了这个演示,我已经 manullay 创建了一个List<Visit>,其中包含您问题中显示的记录。
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
class Visit {
private String url;
private OffsetDateTime dateTime;
public Visit(String url, OffsetDateTime dateTime) {
this.url = url;
this.dateTime = dateTime;
}
public String getUrl() {
return url;
}
public OffsetDateTime getDateTime() {
return dateTime;
}
}
public class Main {
public static void main(String[] args) {
List<Visit> list = List.of(
new Visit("URL1", OffsetDateTime.parse("2018-12-09T14:19:00+00:00")),
new Visit("URL1", OffsetDateTime.parse("2018-12-09T10:13:00+00:00")),
new Visit("URL2", OffsetDateTime.parse("2018-12-09T07:25:00+00:00")),
new Visit("URL3", OffsetDateTime.parse("2018-12-09T06:19:00+00:00")),
new Visit("URL2", OffsetDateTime.parse("2018-12-08T22:03:00+00:00")),
new Visit("URL3", OffsetDateTime.parse("2018-12-08T21:30:00+00:00")),
new Visit("URL3", OffsetDateTime.parse("2018-12-08T09:30:00+00:00")),
new Visit("URL2", OffsetDateTime.parse("2018-12-07T23:30:00+00:00"))
);
// Tests
System.out.println(mostVisitedUrlByDate(list, LocalDate.of(2018, 12, 9)));
System.out.println(mostVisitedUrlByDate(list, LocalDate.now(ZoneOffset.UTC)));
System.out.println(mostVisitedUrlByDate(null, LocalDate.of(2018, 12, 9)));
}
static String mostVisitedUrlByDate(List<Visit> list, LocalDate date) {
return list!=null ? list.stream() // Traverse list if it is not null
.filter(e -> e.getDateTime().toLocalDate().equals(date))
// Get a Map<String, List<Visit>> where value is the list of Visit objects grouped on the URL
.collect(Collectors.groupingBy(Visit::getUrl))
.values()
// Stream of values of Map obtained as a result of grouping
.stream()
// Find the value i.e. List<Visit> of largest size
.max(Comparator.comparing(List::size))
//A List<Visit> with a default Visit object
.orElse(List.of(new Visit("Unknown", OffsetDateTime.now(ZoneOffset.UTC))))
// All Visit elements in the value have same URL. Get the URL of the first value
.get(0)
.getUrl()
// Return "Unknown" if list is null
:"Unknown";
}
}
输出:
URL1
Unknown
Unknown
我在代码中放了足够多的 cmets,以便您更容易理解。另外,我对方法mostVisitedUrlByDate进行了三个测试调用,以便您清楚地了解Stream和Optional上每个方法调用的目的。