我需要得到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,名称=苹果]}
不需要List
与Map#keySet
您对List
&ArrayList
是不必要的,因为Map#keySet
返回一个Set
对象。
此外,在这里引入List
是没有意义的,因为根据定义,Map
或HashMap
中的键的顺序是没有定义的——键可以是任何顺序,甚至每次检索键时都以不同的顺序出现。
让我们来捕获Set
。
Set < String > keySet = myOrders.keySet();
keySet.toString ():
(今天,昨天)
使用Collection
和Map#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'的集合(在您的情况下,是HashMap
s的集合)。
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 ...