用Java为CSV的元素创建一个列表
我有一个关于csv和java的问题。 我有一个包含大量数据的csv文件。例如,有三个不同的id,每个id大约有5k个数据点 csv如下所示: ID、Data1String、Data2Long、Data3Float、Data4Float、Data5Float 我读取csv并将每一列存储到另一个链表中,这样链表中的索引I就永远是一行 我想做的是让每个ID都有一个数据列表 到目前为止,我是这样做的:用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();
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]);
}
听起来你需要一个键,也许是值集合?试着看地图:听起来你需要一个键,也许是一个值集合?尝试查看地图: