【问题标题】:How to return a populated growable Hashmap in Java?如何在 Java 中返回填充的可增长 Hashmap?
【发布时间】:2021-04-06 05:59:00
【问题描述】:

这是我的 Java 代码:

package utils;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import static com.app.core.AcType.*;
import static java.time.LocalDate.parse;


import com.app.core.BankAccount;

public interface CollectionUtils {
//add a static method to return fixed size populated list of bank accounts
    static List<BankAccount> populateAcctList() {
        return Arrays.asList(new BankAccount(10, "abc1", SAVING, 10000, parse("2020-01-19")),
                new BankAccount(100, "abc4", FD, 200000, parse("2019-01-19")),
                new BankAccount(34, "abc3", CURRENT, 5000, parse("2010-11-29")),
                new BankAccount(15, "abc6", SAVING, 12000, parse("2011-06-23")),
                new BankAccount(64, "abc8", SAVING, 9000, parse("2020-01-19")),
                new BankAccount(49, "abc2", DMAT, 13000, parse("2020-01-19"))
                );
    }
    //add a method to ret a populated growable hashmap from above sample data ??????
    
    static HashMap<String, BankAccount> populateAccountHashMap(){
        return 
    }
}

我添加了一个static 方法来返回一个固定大小的银行账户填充列表! 现在,我想添加一个static 方法来从相同的数据返回一个填充的可增长的HashMap!我不知道该怎么做?

【问题讨论】:

  • A Map 在数据对之间映射。你这里只有一个,BankAccount。你想如何使用HashMap
  • 这里有BankAccounts 的列表。所以假设每个银行账户都是地图中的一个值,那么键是什么?并且是帐户的密钥部分还是单独的信息(字符串、整数等)。

标签: java list arraylist collections hashmap


【解决方案1】:

假设您有一个名为 accountsList&lt;BankAccount&gt;,您可以这样做。

Map<String, BankAccount> map = 
                    accounts.stream()
                    .collect(Collectors.toMap(BankAccount::getAccountName, acct->acct));

这假定名称是您的银行帐户实例中的第二个元素(或其他一些字符串)并且具有显示的 getter。如果您希望键是其他东西,请相应地进行调整。请注意,此特定解决方案假定键和 BankAccounts 是一对一的映射。如果您有重复的键(即在这种情况下,每个名称有多个帐户),它将引发异常。然后您可以这样做,其中每个名称都将引用一个喜欢的命名帐户列表。

Map<String,List<BankAccount>> map =  accounts.stream()
                    .collect(Collectors.groupingBy(BankAccount::getAccountName)); 

【讨论】:

    【解决方案2】:

    我有答案了!

    //add a method to ret a populated growable hashmap from above sample data ??????
        
        static HashMap<Integer, BankAccount> populateAccountHashMap(){
            HashMap<Integer, BankAccount> temp = new HashMap<Integer, BankAccount>();
            temp.put(10, new BankAccount(10, "abc1", SAVING, 10000, parse("2020-01-19")));
            temp.put(100, new BankAccount(100, "abc4", FD, 200000, parse("2019-01-19")));
            temp.put(34, new BankAccount(34, "abc3", CURRENT, 5000, parse("2010-11-29")));
            temp.put(15, new BankAccount(15, "abc6", SAVING, 12000, parse("2011-06-23")));
            temp.put(64, new BankAccount(64, "abc8", SAVING, 9000, parse("2020-01-19")));
            temp.put(49, new BankAccount(49, "abc2", DMAT, 13000, parse("2020-01-19")));
            return temp;
        }
    

    已验证!

    【讨论】:

    • 你为什么要那样做?您已经拥有列表中的数据。那么为什么不使用列表来填充 HashMap 呢?否则,如果您对数据进行更改,则需要在两个位置而不是一个位置进行更改。正如您所知道的,您正在创建 BankAccount 的新实例。因此,如果您更改一个数据结构中的一个,该更改将不会反映在另一个数据结构中。这在更改账户余额时可能会出现问题。再说一次,也许这就是你想要的。
    【解决方案3】:

    当您使用 Java 9+ 时,Map.of() 很有用。

    编辑

    我修正了我的例子。 请注意,Map.of() 返回一个不可变映射,因此您需要将其包装以使其可增长。

      Map<String, BankAccount> map = new HashMap<>(Map.of(
        "abc1", new BankAccount(10, "abc1", SAVING, 10000, parse("2020-01-19")),
        "abc4", new BankAccount(100, "abc4", FD, 200000, parse("2019-01-19"))
      ));
    

    【讨论】:

    • 由于Map.of 是一个不可变的映射,它的可增长性不是很大。您需要将 Map.of 映射作为参数传递给映射实现。例如。 new HashMap&lt;&gt;(Map.of(....));
    • @wjs 你是对的......我修正了我的例子。
    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2016-07-21
    • 2018-12-27
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多