【问题标题】:create advanced HashMap, ArrayList, List创建高级 HashMap、ArrayList、List
【发布时间】:2020-11-07 17:10:57
【问题描述】:

我正在尝试使用 HashMap、ArrayList、List 创建一个看起来像这样的结构:

  [
    {
      firstname=Firstname 1,
      lastname=Lastname 1,
      detail=[
        {facturaId=1, date=2020/01/01},
        {facturaId=2, date=2020/01/02},
        {facturaId=3, date=2020/01/03}
      ]
    },
    {
      firstname=Firstname 2,
      lastname=Lastname 2,
      detail=[
        {facturaId=4, date=2020/01/01},
        {facturaId=5, date=2020/01/02},
        {facturaId=6, date=2020/01/03}
      ]
    }
  ]

我的数据结构是这样的:

| factureid |   date   | firstname | lastname |
+-----------+----------+-----------+----------+
|1          |2020/01/01|Firstname 1|Lastname 1|
|2          |2020/01/02|Firstname 1|Lastname 1|
|3          |2020/01/03|Firstname 1|Lastname 1|
|4          |2020/01/01|Firstname 2|Lastname 2|
|5          |2020/01/02|Firstname 2|Lastname 2|
|6          |2020/01/03|Firstname 2|Lastname 2|

我对HashMap不是很熟悉,这是我的尝试:

List<Object[]> results = Info.find();

List<Map<String, String>> detail = new ArrayList<>();

results.stream().forEach((result) -> {
     Map<String, String> detailMap = new HashMap<>();
     detailMap.put("facturaId", result[0].toString());
     detailMap.put("date", result[1].toString());
     detail.add(detailMap);
});
System.out.println(detail);

打印:

  [

    {facturaId=1, date=2020/01/01},
    {facturaId=2, date=2020/01/02},
    {facturaId=3, date=2020/01/03},
    {facturaId=4, date=2020/01/01},
    {facturaId=5, date=2020/01/02},
    {facturaId=6, date=2020/01/03}
  ]

不是我预期的结果。

【问题讨论】:

  • 你的问题是什么?
  • 为什么它不是List&lt;Person&gt;Person 有属性firstnamelastnamedetail

标签: java arrays list arraylist hashmap


【解决方案1】:

使用对象,而不是任意数据

Java 是一种object-oriented 语言。因此,我们可以将这些数据组织到一个类中,而不是与奇数位的数据搏斗。

Java 16 将 new records feature 引入了 Java 16、previewed in Java 15(和 14)。这使得定义一个类变得非常简单。

您有姓名和姓氏的人,每个人都持有一组发票。所以我们需要一个Person 类和一个Invoice 类。

record Invoice (Integer id , LocalDate received ) {};
record Person (String firstName , String lastName , Set<Invoice> invoices ){};

所以我们不再需要你提到的Map。我们只需要Person 对象中的SetList

Set.ofList.of 方法返回一个 non-modifiable 集合。这些方法提供了一个简单的literals 语法。

代表您的数据示例。我更改了您第二个人的发票日期,但它们与您的示例发票编号的顺序相矛盾。

List < Person > people =
        List.of(
                new Person(
                        "Alice" ,
                        "Applecake" ,
                        Set.of(
                                new Invoice( 1 , LocalDate.of( 2020 , Month.JANUARY , 1 ) ) ,
                                new Invoice( 2 , LocalDate.of( 2020 , Month.JANUARY , 2 ) ) ,
                                new Invoice( 3 , LocalDate.of( 2020 , Month.JANUARY , 3 ) )
                        )
                ) ,
                new Person(
                        "Bob" ,
                        "Barker" ,
                        Set.of(
                                new Invoice( 4 , LocalDate.of( 2020 , Month.JANUARY , 4 ) ) ,
                                new Invoice( 5 , LocalDate.of( 2020 , Month.JANUARY , 5 ) ) ,
                                new Invoice( 6 , LocalDate.of( 2020 , Month.JANUARY , 6 ) )
                        )
                )
        );

people.toString(): [Person[firstName=Alice, lastName=Applecake, invoices=[Invoice[id=1, received=2020-01-01], Invoice[id=2, received=2020-01- 02],发票[id=3,收到=2020-01-03]]],人[firstName=Bob,lastName=Barker,发票=[发票[id=4,收到=2020-01-04],发票[ id=5, received=2020-01-05], Invoice[id=6, received=2020-01-06]]]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2021-11-20
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2013-05-30
    • 2011-07-24
    相关资源
    最近更新 更多