如何在HashMap中嵌套HashMap

  • 本文关键字:HashMap 嵌套 java hashmap
  • 更新时间 :
  • 英文 :


我需要得到HashMap,它已经在HashMap作为一个值。

HashMap<String, HashMap<String, Product>> myOrders = new HashMap<>();
myOrders = firebaseMethods.getOrders(FirebaseAuth.getInstance().getCurrentUser().getUid(),snapshot);
List<String> Keys = new ArrayList<>(myOrders.keySet());
HashMap<String,Product> Values = myOrders.values();

我已经尝试过。values()方法,但它没有工作,任何想法我如何才能实现这一点。

您有一个HashMap,其中键类型为String,值类型为HashMap<String, Product>

<标题>

示例数据让我们创建一些示例代码&用数据来表示。让我们使用更通用的Map接口,而不是具体的HashMap类。

record Product( int id , String name ) { }
Map < String, Map < String, Product > > myOrders =
Map.of(
"yesterday" ,
Map.of(
"one" , new Product( 1 , "apples" ) ,
"two" , new Product( 2 , "bananas" )
) ,
"today" ,
Map.of(
"one" , new Product( 7 , "oats" ) ,
"two" , new Product( 42 , "quinoa" )
)
);

myOrders.toString ():

{今天={二=产品[id=42,名称=藜麦],一=产品[id=7,名称=燕麦]},昨天={二=产品[id=2,名称=香蕉],一=产品[id=1,名称=苹果]}

不需要ListMap#keySet

您对List&ArrayList是不必要的,因为Map#keySet返回一个Set对象。

此外,在这里引入List是没有意义的,因为根据定义,MapHashMap中的键的顺序是没有定义的——键可以是任何顺序,甚至每次检索键时都以不同的顺序出现。

让我们来捕获Set

Set < String > keySet = myOrders.keySet();

keySet.toString ():

(今天,昨天)

使用CollectionMap#values

在你的代码行中:

HashMap<String,Product> Values = myOrders.values();

…你犯了期望返回单个Map的错误。您要求使用所有值。每个值都是Map。你会得到一堆地图,而不是一个地图。

读取Map#values的Javadoc告诉您该方法返回Collection。所以你会得到一个Collection< Map < String, Product > >.

那么让我们捕获Collection对象。

Collection < Map < String, Product > > values = myOrders.values();

values.toString ():

[{二=产品[id=2,名称=香蕉],一=产品[id=1,名称=苹果]},{二=产品[id=42,名称=藜麦],一=产品[id=7,名称=燕麦]}]

访问特定键

的单个值如果您正在寻找与特定键配对的值,请使用Map#get方法。

Map < String, Product > mapForKey = myOrders.get( "yesterday" ) ;  // Returns a `Map` object, whose contents are: {two=Product[id=42, name=quinoa], one=Product[id=7, name=oats]}].

调用.values()将返回一个'values'的集合(在您的情况下,是HashMaps的集合)。

List<String> keys = new ArrayList<>(myOrders.keySet());
for(String key: keys) {
HashMap<String, Product> productMap = myOrders.get(key); // This will return the HashMap for the 'key'
... // processing logic goes here

或者更好(如评论中建议的):

for(Entry<String, Map<String, Product>> entry: map.entrySet()) {
Map<String, Product> productMap = entry.getValue();
// processing logic here ... 

最新更新