当ADto中有次位为大写字母的字段,写一个共通方法,参数为List<ADto>、ADto.class、filePath,将List<ADto>出力到csv文件中,且次位为大写字母的字段只出力一次
时间: 2023-12-14 10:36:03 浏览: 51
可以尝试以下代码实现:
```java
public static <T> void writeToCsv(List<T> dataList, Class<T> clazz, String filePath) throws IOException, IllegalAccessException {
// 获取所有字段
Field[] fields = clazz.getDeclaredFields();
// 用于记录需要输出的字段名
List<String> outputFields = new ArrayList<>();
// 用于记录需要输出的字段值
List<List<String>> outputValues = new ArrayList<>();
// 遍历数据列表
for (T data : dataList) {
// 用于记录当前数据的需要输出的字段值
List<String> currentValues = new ArrayList<>();
// 遍历所有字段
for (Field field : fields) {
// 设置可访问私有字段
field.setAccessible(true);
// 获取字段值
Object value = field.get(data);
// 如果是次位为大写字母的字段,并且该字段名还没有被记录过
if (value != null && field.getName().charAt(1) >= 'A' && field.getName().charAt(1) <= 'Z' && !outputFields.contains(field.getName())) {
// 记录字段名
outputFields.add(field.getName());
// 记录字段值
currentValues.add(value.toString());
}
// 如果是次位为大写字母的字段,并且该字段名已经被记录过
else if (value != null && field.getName().charAt(1) >= 'A' && field.getName().charAt(1) <= 'Z' && outputFields.contains(field.getName())) {
// 获取该字段在输出字段列表中的索引
int index = outputFields.indexOf(field.getName());
// 如果当前数据的该字段值与已经记录的值不同,说明需要将该字段值设置为空字符串
if (!currentValues.get(index).equals(value.toString())) {
currentValues.add("");
}
// 否则直接记录该字段值
else {
currentValues.add(value.toString());
}
}
// 如果不是次位为大写字母的字段,直接记录字段值
else {
currentValues.add(value == null ? "" : value.toString());
}
}
// 将当前数据的需要输出的字段值加入到输出值列表中
outputValues.add(currentValues);
}
// 写入到csv文件中
try (CSVWriter writer = new CSVWriter(new FileWriter(filePath))) {
// 输出字段名
writer.writeNext(outputFields.toArray(new String[0]));
// 输出字段值
for (List<String> values : outputValues) {
writer.writeNext(values.toArray(new String[0]));
}
}
}
```
该方法使用了 Java 的反射机制,可以动态获取类的所有字段,并根据字段名和字段值来判断是否需要输出。具体实现流程如下:
1. 首先获取类的所有字段。
2. 遍历数据列表,对于每个数据,遍历所有字段:
- 如果是次位为大写字母的字段,并且该字段名还没有被记录过,记录该字段名,并记录该数据的该字段值。
- 如果是次位为大写字母的字段,并且该字段名已经被记录过,则比较该数据的该字段值与已经记录的值是否相同,如果不同,则将该字段值设置为空字符串,否则记录该字段值。
- 如果不是次位为大写字母的字段,直接记录该字段值。
3. 将所有需要输出的字段名和字段值存储到对应的列表中。
4. 使用 CSVWriter 将数据写入到 csv 文件中。
阅读全文
相关推荐









