正在为 Java 中的多个循环生成 csv 文件?
Generating csv file for multiple loop in Java?
我正在尝试生成一个包含级联值的报告,如下所示:
| Country | City | Town |
--------------------------------------
| Country A | City X | Town 1 |
| Country A | City X | Town 2 |
| Country A | City Y | Town 1 |
| Country A | City Y | Town 2 |
| Country B | City Q | Town 1 |
| Country B | City Q | Town 2 |
| Country B | City T | Town 1 |
| Country B | City T | Town 2 |
我可以如上所示正确生成国家和城市,但我为每个城市传递了一个 j
索引值,如下所示。但是,对于城镇,我还需要另一个索引变量,例如 k
和 loop.
public MultipartFile exportData() throws IOException {
// code omitted for brevity
int rowCount = 0;
final List<CountryDTO> countryList = countryService.findAll();
int iSize = countryList.size();
for (int i = 0; i < iSize; i++) {
int jSize = countryList.get(i).getCityList().size();
for (int j = 0; j < jSize; j++) {
int kSize = countryList.get(i).getCityList().get(j).getTownList().size();
for (int j = 0; k < kSize; k++) {
Row row = sheet.createRow(rowCount++);
write(countryList.get(i), row, j, k);
}
}
}
// code omitted for brevity
}
private static void write(CountryDTO country, Row row, int j) {
Cell cell = row.createCell(0);
cell.setCellValue(country.getName());
cell = row.createCell(1);
cell.setCellValue(country.getCityList().get(j).getName());
cell = row.createCell(2);
cell.setCellValue(country.getCityList().get(j).getTownList().get(k).getName());
}
我不确定是否有更好的方法。由于我是在 Java 中生成报告的新手,所以我不知道如何继续使用以下方法(如果可以的话,我会使用这种方法,因为它已经在当前项目中使用过)。
每个
您可以使用 for-each 语法而不是索引 for 循环。
for( Country country : countryService.findAll() )
{
for( City city : country.getCityList() )
{
for( Town town : city.getTownList() )
{
write( country , city , town ) ;
}
}
}
请注意,我们将 write
方法重新定义为忽略原始数据结构。它的工作是写入数据,而不是检索数据。不需要该方法来理解嵌套列表。
继续研究 Separation Of Concerns. A method and a class should know as little about the outside world as possible. This prevents your code from becoming “brittle”,其中一个小改动会导致您的代码到处乱码。
记录
我会在 Java 16+ 中更进一步,将 record 对象传递给 write
方法。记录是编写 class 的简短方式,其主要目的是透明且不可变地传递数据。编译器隐式创建构造函数、getter、equals
& hashCode
和 toString
.
record CountryCityTown( String country , String city , String town ) {}
更改 write
方法以获取该类型的单个对象。
void write ( CountryCityTown countryCityTown ) { … }
我正在尝试生成一个包含级联值的报告,如下所示:
| Country | City | Town |
--------------------------------------
| Country A | City X | Town 1 |
| Country A | City X | Town 2 |
| Country A | City Y | Town 1 |
| Country A | City Y | Town 2 |
| Country B | City Q | Town 1 |
| Country B | City Q | Town 2 |
| Country B | City T | Town 1 |
| Country B | City T | Town 2 |
我可以如上所示正确生成国家和城市,但我为每个城市传递了一个 j
索引值,如下所示。但是,对于城镇,我还需要另一个索引变量,例如 k
和 loop.
public MultipartFile exportData() throws IOException {
// code omitted for brevity
int rowCount = 0;
final List<CountryDTO> countryList = countryService.findAll();
int iSize = countryList.size();
for (int i = 0; i < iSize; i++) {
int jSize = countryList.get(i).getCityList().size();
for (int j = 0; j < jSize; j++) {
int kSize = countryList.get(i).getCityList().get(j).getTownList().size();
for (int j = 0; k < kSize; k++) {
Row row = sheet.createRow(rowCount++);
write(countryList.get(i), row, j, k);
}
}
}
// code omitted for brevity
}
private static void write(CountryDTO country, Row row, int j) {
Cell cell = row.createCell(0);
cell.setCellValue(country.getName());
cell = row.createCell(1);
cell.setCellValue(country.getCityList().get(j).getName());
cell = row.createCell(2);
cell.setCellValue(country.getCityList().get(j).getTownList().get(k).getName());
}
我不确定是否有更好的方法。由于我是在 Java 中生成报告的新手,所以我不知道如何继续使用以下方法(如果可以的话,我会使用这种方法,因为它已经在当前项目中使用过)。
每个
您可以使用 for-each 语法而不是索引 for 循环。
for( Country country : countryService.findAll() )
{
for( City city : country.getCityList() )
{
for( Town town : city.getTownList() )
{
write( country , city , town ) ;
}
}
}
请注意,我们将 write
方法重新定义为忽略原始数据结构。它的工作是写入数据,而不是检索数据。不需要该方法来理解嵌套列表。
继续研究 Separation Of Concerns. A method and a class should know as little about the outside world as possible. This prevents your code from becoming “brittle”,其中一个小改动会导致您的代码到处乱码。
记录
我会在 Java 16+ 中更进一步,将 record 对象传递给 write
方法。记录是编写 class 的简短方式,其主要目的是透明且不可变地传递数据。编译器隐式创建构造函数、getter、equals
& hashCode
和 toString
.
record CountryCityTown( String country , String city , String town ) {}
更改 write
方法以获取该类型的单个对象。
void write ( CountryCityTown countryCityTown ) { … }