从CSV类型数据创建地图

时间:2017-12-02 08:49:13

标签: java

我将以下数据存储在" .txt"文件:

Dave,40,04/05/1978
Scott,34,05/06/1986
Sam,24,04/05/1978
Love,32,04/06/1989
Harry,29,04/06/1989

我已使用BufferedReader进行阅读,拆分(使用,)并将其存储在String[] stringArray中。

现在stringArray[0]将有名称,stringArray[1]将有号码,stringArray[2]将有日期。

我现在正在构建一个HashMap,如下所示,将关键字显示为日期(String),将值List显示为具有相同日期的Member出生

预期产出:

DOBMap: {04-05-1978=[[Dave,40],[Same,24]], 05/06/1986=[[Scott,34]], 04/06/1989=[[Love,32],[Harry,29]]

我有Member,其中包含以下变量:

private String name;
private String no;
private String DOB;

由于我是收藏新手,我正在寻求帮助以实现此DOBMap输出。

2 个答案:

答案 0 :(得分:1)

我认为您可以通过使用Java Stream API(https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html)做得更好。 在这里,我假设您的Memeber类具有构造函数:

Member(String[] array)

在下列情况下:

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
import static java.util.stream.Collectors.groupingBy;

public class SO1 {

    public static void main(String[] args) {
        String filePath = ".../src/main/resources/SO1.txt";

        try (Stream<String> lines = Files.lines(Paths.get(filePath))) {

            Map<String, List<Member>> map = lines
                    .map(line -> line.split(","))
                    .map(Member::new)
                    .collect(groupingBy(Member::getDOB));

            System.out.println(map);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

打印:

{05/06/1986=[Member{name='Scott', no='34', dob='05/06/1986'}], 04/05/1978=[Member{name='Dave', no='40', dob='04/05/1978'}, Member{name='Sam', no='24', dob='04/05/1978'}], 04/06/1989=[Member{name='Love', no='32', dob='04/06/1989'}, Member{name='Harry', no='29', dob='04/06/1989'}]}

可以说,这段代码的意图比明确迭代的代码更清晰。

答案 1 :(得分:0)

您可以遍历所有成员并将其插入HashMap。我在这个例子中使用了ArrayList,但如果你愿意,我可以用常规数组重写它。

因此,假设您有一个名为members的ArrayList。

// members is an ArrayList of Member objects

HashMap<String, ArrayList<ArrayList<String>>> dobMap = new HashMap<>();
for (Member m : members) {
    String[] temp = {m.getName(), m.getNo()}; // e.g. [Dave, 40]
    // already in the map, so just push it to the existing ArrayList in there
    if (dobMap.containsKey(m.getDOB())) {
        dobMap.get(m.getDOB()).add(temp); // e.g. [[Dave, 40]].add([Sam, 24])
    } else { // not in the map yet, so push a new ArrayList to that spot
        ArrayList<String[]> temp2 = new ArrayList<>();
        temp2.add(temp); // e.g. [[Dave, 40]]
        dobMap.put(m.getDOB(), temp2);
    }
}

稍微不同的解决方案(使用ArrayList ArrayList代替ArrayList String[]}:

HashMap<String, ArrayList<ArrayList<String>>> dobMap = new HashMap<>();
for (Member m : members) {
    ArrayList<String> temp = new ArrayList<>();
    temp.add(m.getName());
    temp.add(m.getNo());
    if (dobMap.containsKey(m.getDOB())) {
        dobMap.get(m.getDOB()).add(temp);
    } else {
        ArrayList<ArrayList<String>> temp2 = new ArrayList<>();
        temp2.add(temp);
        dobMap.put(m.getDOB(), temp2);
    }
}

通过它,您只需运行System.out.println(dobMap);并查看结果与您的预期完全一致。从第一个解决方案打印HashMap将需要一些努力来打印HashMap的内容,因为它不会像ArrayList那样打印常规数组。但他们都以同样的方式存储信息。

但我认为不应存储ArrayList ArrayList,而应将其存储为ArrayList Member。所以我将展示第三种解决方案,即:

HashMap<String, ArrayList<Member>> dobMap = new HashMap<>();
for (Member m : members) {
    if (dobMap.containsKey(m.getDOB())) {
        dobMap.get(m.getDOB()).add(m);
    } else {
        ArrayList<Member> temp = new ArrayList<>();
        temp.add(m);
        dobMap.put(m.getDOB(), temp);
    }
}

然后在toString()中覆盖Member,如下所示:

@Override
public String toString() {
    return String.format("[%s, %s]", this.name, this.no);
}

这第三种解决方案似乎最为明确。

在此示例中,我使用以下Member类作为基础:

class Member {
    private String name, no, dob;
    public Member(String name, String no, String dob) {
       this.name = name;
       this.no = no;
       this.dob = dob;
    }
    public String getName() { return this.name; }
    public String getNo() { return this.no; }
    public String getDOB() { return this.dob; }
}

如何定义ArrayList Member// parts is an array of length 3 like you said ArrayList<Member> members = new ArrayList<>(); members.add(new Member(parts[0], parts[1], parts[2]); 对象的示例如下:

require 'vendor/autoload.php';
use Aws\S3\S3Client;
$s3 = S3Client::factory();

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';

$result = $s3->deleteObject(array(
    'Bucket' => $bucket,
    'Key'    => $keyname
));