У меня есть файл с такой структурой:
a, City1, 2013-09-05 14:08:15
b, City2, 2015-10-08 16:10:15
c, City2, 2010-09-05 14:08:15
d, City1, 2011-09-05 14:08:15
Это значения, разделенные запятыми, и строки, разделенные символом конца строки.
Мне нужно создать структуру данных в Java 8, где у меня есть строки, сгруппированные по городам и внутри каждой такой группы, отсортированные по дате в порядке возрастания и подсчета количества строк в каждой группе.
Я пытался:
- Создать
List<Row>
из файла
- Создайте
Map<String, List<Row>>
, который сгруппирован по городам и отсортирован по дате в каждой группе
- Создать
Map<String, Long>
для группировки по городу и количеству строк
Это код, который я пробовал:
public PhotoResponse processFile() {
//read each line of the file and create a new object PhotoIn for each one
List<PhotoIn> lista = null;
try {
lista = Files.lines(Paths.get(file))
.map(line -> line.split(","))
.map(photo -> new PhotoIn(photo[0].substring(0, photo[0].lastIndexOf(".")), photo[0].substring(photo[0].lastIndexOf(".") + 1 ), photo[1].trim(), parseDate(photo[2]), index++))
.collect(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
}
return generateOutput(lista);
}
private PhotoResponse generateOutput(List<PhotoIn> photos) {
//Grouping photos by city
Map<String, List<PhotoIn>> photosByCity = photos.stream().collect(Collectors.groupingBy(PhotoIn::getCity));
//Sorting photos by date into each city
photosByCity.values().forEach(list -> list.sort(Comparator.comparing(PhotoIn::getDate)));
//Grouping photos by city and amount
Map<String, Long> numeroPorCiudades = photos.stream().collect(Collectors.groupingBy(PhotoIn::getCity, Collectors.counting()));
List<PhotoOut> photoOutList = new ArrayList<PhotoOut>();
photosByCity.forEach((key, list) -> {
String digits = Integer.toString(Long.toString(numeroPorCiudades.get(key)).length());
counter = 1;
list.forEach(photoIn -> {
photoOutList.add(new PhotoOut(photoIn.getName() + "." + photoIn.getExtension(), key + String.format("%0" + digits + "d", counter++) + "." + photoIn.getExtension(), photoIn.getIndex()));
});
});
return sortOutput(photoOutList);
}
Я решаю проблему, но ищу лучший и более эффективный способ сделать это с помощью Java 8. Можно ли выполнить эти 3 шага всего за один шаг? . Мне нужно сгруппировать всю эту информацию в одну структуру данных.