提问者:小点点

JAVA从CSV文件生成枚举


我的目标是生成一个枚举来创建一个EnumSet。如果编写枚举,这部分就可以工作。

我不想编写50000行的枚举,而是想导入50000行csv。当我尝试用csv导入替换我编写的枚举时,问题就开始了。

package VilleEnumSet;

public class VilleEnumSet {
    
    
    //ENUM SANS CSV
    enum Ville {
        Paris("FR", "75000", "Paris", "Ile de France", "Paris", "75", "Paris", "751", "48.8534", "2.3488"),
        Lyon("FR", "69000", "Lyon", "Auvergne-Rhone-Alpes", "Rhone", "69", "Lyon", "691", "45.7485", "4.8467"),
        Marseille("FR", "13000", "Marseille", "Provence-Alpes-Cote d'Azure", "Bouches-du-Rhone", "13", "Marseille", "133", "43.2969", "5.3811"),
        Montpellier("FR", "34000", "Montpellier", "Occitanie", "Herault", "34", "Montpellier", "343", "43.6109", "3.8764");
    
        
    //ATTRIBUTS
    private final String pays;
    private final String codePostal;
    private final String nom;
    private final String region;
    private final String departement;
    private final String numDepartement;
    private final String prefecture;
    private final String codeCommune;
    private final String latitude;
    private final String longitude;
    
    

    //CONSTRUCTEUR
    private Ville(String pays, String codePostal, String nom, String region, String departement, String numDepartement,
            String prefecture, String codeCommune, String latitude, String longitude) {
        this.pays = pays;
        this.codePostal = codePostal;
        this.nom = nom;
        this.region = region;
        this.departement = departement;
        this.numDepartement = numDepartement;
        this.prefecture = prefecture;
        this.codeCommune = codeCommune;
        this.latitude = latitude;
        this.longitude = longitude;
    }

    
    //GETTERS
    public String getPays() {
        return pays;
    }

    public String getCodePostal() {
        return codePostal;
    }

    public String getNom() {
        return nom;
    }

    public String getRegion() {
        return region;
    }

    public String getDepartement() {
        return departement;
    }

    public String getNumDeprtement() {
        return numDepartement;
    }

    public String getPrefecture() {
        return prefecture;
    }

    public String getCodeCommune() {
        return codeCommune;
    }

    public String getLatitude() {
        return latitude;
    }

    public String getLongitude() {
        return longitude;
    }
    
    
    //TOSTRING
    public String toString() {
        return String.format("%-40s%-10s\n", "Pays: " + pays, "Code Postal: " + codePostal) 
                + String.format("%-40s%-10s\n", "Nom: " + nom, "Region: " + region) 
                + String.format("%-40s%-10s\n", "Departement: " + departement, "Num Departement: " + numDepartement)
                + String.format("%-40s%-10s\n", "Prefecture: " + prefecture, "Code Commune: " + codeCommune)
                + String.format("%-40s%-10s\n\n", "Latitude: " + latitude, "Longitude: " + longitude);
    }
    }

}
package VilleEnumSet;

import java.util.EnumSet;
import java.util.Iterator;

import VilleEnumSet.VilleEnumSet.Ville;

public class MainVilleEnumSet {
    
public static void main(String[] args) {
        
        // Creating an EnumSet using allOf()
        EnumSet<Ville> villes = EnumSet.allOf(Ville.class);
        
        // Creating an iterator on games
        Iterator<Ville> iterate = villes.iterator();
        
        // Message
        System.out.println("EnumSet: " + "\n");
        
        while (iterate.hasNext()) {
            System.out.println(iterate.next());
        }
    }

}

我的代码返回这个:

EnumSet: 

Pays: FR                                Code Postal: 75000
Nom: Paris                              Region: Ile de France
Departement: Paris                      Num Departement: 75
Prefecture: Paris                       Code Commune: 751
Latitude: 48.8534                       Longitude: 2.3488


Pays: FR                                Code Postal: 69000
Nom: Lyon                               Region: Auvergne-Rhone-Alpes
Departement: Rhone                      Num Departement: 69
Prefecture: Lyon                        Code Commune: 691
Latitude: 45.7485                       Longitude: 4.8467

对于csv结构,每一列对应于“VilleEnumSet”类中的一个属性

我不知道该怎么办。我已经寻求帮助,但许多人建议切换到我不想要的列表,聊天GPT没有帮助。


共2个答案

匿名用户

枚举旨在表示编译时已知的一小组值。这些值的名称旨在在您的源代码中使用。

那不符合你的情况。

您在运行时加载了大量值。表示这些值是自定义类的目的。对自定义类的对象进行分组是Java集合框架的目的,其中包含列表、集合、队列、映射等。

如果您的自定义类的主要目的是透明且不可变地传递数据,请将您的类定义为记录。

当CSV库导入每一行输入时,实例化记录类的一个对象。添加到集合对象,可能是List的实现。

匿名用户

虽然您绝对不会为此使用枚举,但实际上有一个有效的用例,因此值得回答。

对您的问题的实际直接回答是,您希望以主动方式生成枚举的代码。有一个java的注释预处理步骤可以做到这一点,或者您可以在编译前读取文件并发出源代码。

你必须小心这个代码发出步骤,因为如果你没有把它放入正确的构建步骤中,它会对你的IDE造成严重破坏。

基本上,这是一个高级过程,对于这个特定的任务来说尤其错误,但在正确的条件下,它是可行的,而且非常有效。