用Java为CSV的元素创建一个列表

用Java为CSV的元素创建一个列表,java,csv,linked-list,Java,Csv,Linked List,我有一个关于csv和java的问题。 我有一个包含大量数据的csv文件。例如,有三个不同的id,每个id大约有5k个数据点 csv如下所示: ID、Data1String、Data2Long、Data3Float、Data4Float、Data5Float 我读取csv并将每一列存储到另一个链表中,这样链表中的索引I就永远是一行 我想做的是让每个ID都有一个数据列表 到目前为止,我是这样做的: LinkedList<String> new_id = new LinkedList();

我有一个关于csv和java的问题。 我有一个包含大量数据的csv文件。例如,有三个不同的id,每个id大约有5k个数据点

csv如下所示: ID、Data1String、Data2Long、Data3Float、Data4Float、Data5Float

我读取csv并将每一列存储到另一个链表中,这样链表中的索引I就永远是一行

我想做的是让每个ID都有一个数据列表

到目前为止,我是这样做的:

LinkedList<String> new_id = new LinkedList();
LinkedList<String> new_data1 = new LinkedList();
LinkedList<String> new_data2 = new LinkedList();
....
....

for(int i = 0; i < id.size(); i++){
    if(id.get(i).equals(String theidiwant){
        new_id.add(id.get(i));
        new_data1.add(data1.get(i));
        ....
        ....
}
if (myMap.containsKey([your_key])) {
    List<String> list = myMap.get([your_key]);
}
所以我的问题是,是否有一个简单的解决方案来为每个id创建这些数据的列表

我希望你明白我想问什么。 抱歉这么复杂的描述


干杯

首先,您应该为行创建一个类,并使用一个表示一行的对象,例如

public class Row{
    public String id;
    public String data1;
    public long data2;
    public float data3;
    public float data4;
    public float data5;

    public Row(String id, String data1, long data2, float data3, float data4, float data5) {
        //Enter constructor here e.g. this.id = id...
    }
}
然后,可以使用以下命令将对象过滤到列表中:

... after parsing the data into List<Row> data;

List<Row> filteredList = data.stream().filter(
    row -> row.id.equals(String theidiwant))
    .collect(Collectors.toCollection(LinkedList::new));
如果你想要每个id都有一个列表,你可以像SpaceCowboy说的那样创建一个带有列表的地图

Map<String, List<Row>> mappedValues = new HashMap<>();
for(Row row : data) {
    if(mappedValues.containsKey(row.id) {
        List<Row> values = mappedValues.get(row.id)
        values.add(row)
    }
    else {
        List<Row> newValues = new ArrayList<>();
        newValues.add(row)
        mappedValues.put(row.id, newValues);
    }
}

首先,您应该为行创建一个类,并拥有一个表示一行的对象,例如

public class Row{
    public String id;
    public String data1;
    public long data2;
    public float data3;
    public float data4;
    public float data5;

    public Row(String id, String data1, long data2, float data3, float data4, float data5) {
        //Enter constructor here e.g. this.id = id...
    }
}
然后,可以使用以下命令将对象过滤到列表中:

... after parsing the data into List<Row> data;

List<Row> filteredList = data.stream().filter(
    row -> row.id.equals(String theidiwant))
    .collect(Collectors.toCollection(LinkedList::new));
如果你想要每个id都有一个列表,你可以像SpaceCowboy说的那样创建一个带有列表的地图

Map<String, List<Row>> mappedValues = new HashMap<>();
for(Row row : data) {
    if(mappedValues.containsKey(row.id) {
        List<Row> values = mappedValues.get(row.id)
        values.add(row)
    }
    else {
        List<Row> newValues = new ArrayList<>();
        newValues.add(row)
        mappedValues.put(row.id, newValues);
    }
}

我不知道为什么要创建列列表,行列表更有意义。尽管如此,使用java类映射列并创建行列表将是最合适的。

我不确定为什么要创建列列表,行列表更有意义。尽管如此,使用java类映射列并创建行列表将是最合适的。

您可能希望尝试使用映射

Map<Integer, List<String>> myMap = new HashMap<Integer, List<String>>();

LinkedList<String> data = new LinkedList<>();

myMap.put([your_key],data);
然后,您可以访问id如下的列表:

LinkedList<String> new_id = new LinkedList();
LinkedList<String> new_data1 = new LinkedList();
LinkedList<String> new_data2 = new LinkedList();
....
....

for(int i = 0; i < id.size(); i++){
    if(id.get(i).equals(String theidiwant){
        new_id.add(id.get(i));
        new_data1.add(data1.get(i));
        ....
        ....
}
if (myMap.containsKey([your_key])) {
    List<String> list = myMap.get([your_key]);
}

您可能想尝试使用地图

Map<Integer, List<String>> myMap = new HashMap<Integer, List<String>>();

LinkedList<String> data = new LinkedList<>();

myMap.put([your_key],data);
然后,您可以访问id如下的列表:

LinkedList<String> new_id = new LinkedList();
LinkedList<String> new_data1 = new LinkedList();
LinkedList<String> new_data2 = new LinkedList();
....
....

for(int i = 0; i < id.size(); i++){
    if(id.get(i).equals(String theidiwant){
        new_id.add(id.get(i));
        new_data1.add(data1.get(i));
        ....
        ....
}
if (myMap.containsKey([your_key])) {
    List<String> list = myMap.get([your_key]);
}

听起来你需要一个键,也许是值集合?试着看地图:听起来你需要一个键,也许是一个值集合?尝试查看地图: