如何在java中用带有分隔元素的列表的Map读取csv文件

pftdvrlh  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(326)

我不知道为什么我之前的问题已经结束了,所以我决定用另一种方式问这个问题。嗨,我是一个java编程的新手,我有一些关于从csv文件读取数据的问题。这是我的csv文件:

1,Ali,1201345673,Normal
2,Siti,1307891435,Normal

以下是我如何读取数据:

Map<String, List<Customer>> customers =
    Files.lines(Paths.get("customer.csv"))
            .map(line -> line.split("\\s*,\\s*"))
            .map(field -> new Customer(
                    Integer.parseInt(field[0]), field[1],
                    Integer.parseInt(field[2]), field[3]))
            .collect(Collectors
                   .groupingBy(Customer::getName));
    System.out.println (customers);
    return customers;

客户类别:

public class Customer {
private int customerNo;
private String name;
private int phoneNo;
private String status;
public Customer () {}
public Customer (int customerNo, String name, int phoneNo, String status){
    this.customerNo = customerNo;
    this.name = name;
    this.phoneNo = phoneNo;
    this.status = status;
}
public String getName(){
    return name;
}

public String toString(){
    return customerNo + " " + name + " " + phoneNo + " " + status;
}

然后我意识到我的Map是这样的:

(Ali = ["1 Ali 1201345673 Normal"] , Siti = ["2 Siti 1307891435 Normal"])

但不是我想要的那样:

(Ali = [1 , "Ali" , 1201345673 , "Normal" ] , Siti = [2 , "Siti" , 1307891435 , "Normal" ])

对于ali,1是一个元素,ali是一个元素,1201345673是一个元素,normal是另一个元素。
每个人的数据都被读入我的列表中的一个元素,所以我不能像数组列表那样输出它们。所以问题是,当我读取csv数据时,我如何分离列表中的每个元素,我真的需要程序的map函数,所以请保留它,或者我如何在我的map中读取数组列表中的数据。谢谢你的关注。

x33g5p2x

x33g5p2x1#

我相信以下是你想要的。

/*
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
import java.util.stream.Collectors;
 */
Supplier<List<List<Object>>> s = () -> new ArrayList<List<Object>>();

BiConsumer<List<List<Object>>, Customer> b = (l, c) -> {
            l.add(c.toList());
};

BinaryOperator<List<List<Object>>> o = (l1, l2) -> {l1.addAll(l2); return l1;};

Collector<Customer, List<List<Object>>, List<List<Object>>> c = Collector.of(s, b, o);

Map<String, List<List<Object>>> customers =
        Files.lines(Paths.get("customer.csv"))
             .map(line -> line.split("\\s*,\\s*"))
             .map(field -> new Customer(Integer.parseInt(field[0]),
                                        field[1],
                                        Integer.parseInt(field[2]),
                                        field[3]))
             .collect(Collectors.groupingBy(Customer::getName,
                                            Collectors.mapping(Function.identity(), c)));
System.out.println(customers);

输出为

{Siti=[[2, Siti, 1307891435, Normal]], Ali=[[1, Ali, 1201345673, Normal]]}

我创建了一个自定义 Collector ,即我编写了 Collector 接口。
中的每个值 Map ,即。 customers ,是列表的列表。根据您的示例csv文件,文件中有两行,每行都有一个单独的名称。因此 Map 包含两个条目,每个条目的值是一个列表,其中包含一个元素,该元素本身就是一个列表。这就是为什么产量加倍 [ 以及 ] 角色。
注意,我添加了 toList 上课 Customer ```
public class Customer {
private int customerNo;
private String name;
private int phoneNo;
private String status;

public Customer() {
}

public Customer(int customerNo, String name, int phoneNo, String status) {
    this.customerNo = customerNo;
    this.name = name;
    this.phoneNo = phoneNo;
    this.status = status;
}

public String getName() {
    return name;
}

public List<Object> toList() {
    return List.of(customerNo, name, phoneNo, status);
}

public String toString() {
    return customerNo + " " + name + " " + phoneNo + " " + status;
}

}

mtb9vblg

mtb9vblg2#

这是因为tostring()方法。它通过基本上定义一个自定义格式的字符串来定义如何打印类。
如果您将其更改为以下内容:

public String toString(){
    return customerNo + ", " + name + ", " + phoneNo + ", " + status;
}

它将打印为:

Ali = ["1, Ali, 1201345673, Normal"]

您可以自定义此函数以按所需方式打印它。
试试这个:

public String toString(){
    return customerNo + ", \"" + name + "\", " + phoneNo + ", \"" + status + "\"";
}

相关问题