漫天啊 2023-03-20 15:00 采纳率: 73.3%
浏览 23
已结题

public <T> List<T> saveFile(File file,Class<T> c){}怎么样实现这份问题

一个文本文件中包含若干行name,sex,age,address数据,
每个数据间以逗号分割。编写方法读取文本文件将数据保存成List集合。
List中的元素类型自定义为Student。方法参数是要读取的文件的File对象和转换成的类类型。
要求使用这种方法,下面我的代码直接用的Student类作为返回参数泛型

public <T> List<T> saveFile(File file,Class<T> c){}

public class GenericInterface {

    public static void main(String[] args) {
        File f = new File("d.txt");
        List<Student> list = saveFile(f);
        for(Student s:list) {
            System.out.println(s);
        }
    }
    private static List<Student> saveFile(File file){
        List<Student> list = new ArrayList<>();
        try {
            BufferedReader in = new BufferedReader(new FileReader(file));
            String s = "";
            while((s = in.readLine())!=null) {
                String str[] = s.split(",");
                list.add(new Student(str[0], str[1], Integer.valueOf(str[2]), str[3]));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
}
class Student{
    private String name;
    private String sex;
    private Integer age;
    private String address;
    public Student() {
        super();
    }
    public Student(String name, String sex, Integer age, String address) {
        super();
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.address = address;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", sex=" + sex + ", age=" + age + ", address=" + address + "]";
    }
}


  • 写回答

3条回答 默认 最新

  • lshen01 2023-03-20 15:08
    关注

    参考GPT和自己的思路:

    好的,根据您的问题,我可以给您一个实现方法:

    public <T> List<T> saveFile(File file,Class<T> c){
        List<T> list = new ArrayList<>();
        try {
            BufferedReader in = new BufferedReader(new FileReader(file));
            String s = "";
            while((s = in.readLine())!=null) {
                String str[] = s.split(",");
                T obj = c.newInstance();
                Field[] fields = c.getDeclaredFields();
                for(int i=0;i<fields.length;i++) {
                    fields[i].setAccessible(true);
                    if(fields[i].getType()==String.class) {
                        fields[i].set(obj, str[i]);
                    }else if(fields[i].getType()==Integer.class||fields[i].getType()==int.class) {
                        fields[i].set(obj, Integer.valueOf(str[i]));
                    }
                }
                list.add(obj);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return list;
    }
    

    这个方法接收一个File类型的参数和一个Class类型的参数,返回一个List类型的数据。在方法的实现中,我们首先通过BufferedReader从文件中读取每一行的数据,然后使用逗号分隔符将每一行数据分割成字符串数组。根据传入的Class类型参数,通过反射创建出对应类型的实例对象。然后再根据类属性名称和类型对其进行赋值。取得类的所有属性信息后,我们循环检查每个属性的类型,如果是String类型,则我们可以直接将字符串数组元素赋值给对象属性;如果是Integer类型,则需要将字符串元素转化为整型后再进行赋值,避免类型转换出现异常。

    最后,将通过反射设置好属性值的对象加入到List集合中,并返回该集合。

    当我们在调用该方法时,只需要传入要读取的文件和要转换为的类型即可。类的属性借助于反射技术在具体实现中进行处理,这样写的好处是我们可以通过改变类的属性内容灵活适应不同的业务需求。

    希望这个答复对您有所帮助!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月20日
  • 已采纳回答 3月20日
  • 创建了问题 3月20日

悬赏问题

  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上