Java新手......我有一本這樣的字典:
electronictypeModelsMap =
{
"laptops" => ["macbook", "thinkpad", "yoga"],
"desktops" => ["macmini", "imac", "otherDesktop"],
"smartphones" => ["iphone", "galaxy5", "oneplus"]
}
像上面的 3 一樣,只會有少量的鍵,但每個值(串列)中會有幾百個元素....
我希望能夠以相反的方式查詢它:
dictionary.get("macbook")將回傳“筆記本電腦”
所以我想我想轉換成一個新的地圖,每個串列的每個元素作為一個鍵,對應的值設定為原始鍵。像這樣:
{
"macbook" => "laptops",
"thinkpad" => "laptops",
"yoga"=> "laptops",
"macmini" => "desktops",
"imac" => "desktops",
"otherDesktop" => "desktops",
"iphone" => "smartphones",
"galaxy5" => "smartphones",
"oneplus" => "smartphones",
}
在 Java 11 中有沒有一種巧妙的方法來做到這一點?
在紅寶石中你可以做這樣的事情
newMap = Hash.new
electronictypeModelsMap.each do |k,v|
v.each do |value|
newMap[value] = k
end
end
uj5u.com熱心網友回復:
假設您有如下地圖:
Map<String,List<String>> electronictypeModelsMap =
Map.of("laptops", List.of("macbook", "thinkpad", "yoga"),
"desktops", List.of("macmini", "imac", "otherDesktop"),
"smartphones", List.of("iphone", "galaxy5", "oneplus"));
最簡單的解決方案可能是使用嵌套forEach
Map<String,String> reMapped = new HashMap<>();
electronictypeModelsMap.forEach((key,list) -> {
list.forEach(item -> {
reMapped.put(item, key);
});
});
uj5u.com熱心網友回復:
如果您確定每個值串列中的每個元素都是唯一的(即在所有map的范圍內不同),您可以采用以下方法:
- 在入口集上創建一個流;
flatMap()通過基于串列的每個元素和當前串列映射到的鍵創建一個新條目,使用扁平條目,以便一個值成為鍵,反之亦然。- 使用 將資料收集到地圖中
Collectors.toMap()。
Map<String, List<String>> source =
Map.of("laptops", List.of("macbook", "thinkpad", "yoga"),
"desktops", List.of("macmini", "imac", "otherDesktop"),
"smartphones", List.of("iphone", "galaxy5", "oneplus"));
Map<String, String> result =
source.entrySet().stream()
.flatMap(entry -> entry.getValue().stream().map(element ->
Map.entry(element, entry.getKey())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
result.forEach((k, v) -> System.out.println(k " => " v));
輸出
galaxy5 => smartphones
macmini => desktops
macbook => laptops
etc.
請注意,如果在初始映射中至少有一個元素(如“macbook”)已映射到多個類別,則上面列出的收集器將無法決議重復項,并且會導致IllegalStateException. mergeFunction作為補救措施,您需要通過提供 a作為 的第三個引數來定義如何覆寫該值toMap(),或者使用收集器Collectors.groupingBy()來保留映射到同一鍵的所有值。
uj5u.com熱心網友回復:
無需制作另一張地圖。您可以查詢現有映射,以查找其值包含目標字串的鍵。
流在這里對進行查詢很有用。
制作一些示例資料。
Map < String, Set < String > > map =
Map.of(
"laptops" , Set.of( "macbook" , "thinkpad" , "yoga" ) ,
"desktops" , Set.of( "macmini" , "imac" , "otherDesktop" ) ,
"smartphones" , Set.of( "iphone" , "galaxy5" , "oneplus" )
);
你說:
dictionary.get("macbook") 將回傳 "laptops"
我們可以獲得地圖的所有條目。每個條目都是一個鍵值對,我們的字串導致一組字串。
制作地圖條目的流。
過濾條目,尋找任何其值(字串集)包含我們的目標,macbook. 找到匹配后停止尋找。
在一個Optional條目中的結果。我們需要Optional在這里,因為可能沒有找到,我們可能沒有命中。
在您的示例的這種情況下,我們知道我們有一個成功,所以繼續。我們知道找到的條目的值是一個包含我們目標的集合。所以提取密鑰并報告。
Optional < Map.Entry < String, Set < String > > > entry =
map
.entrySet()
.stream()
.filter( ( Map.Entry < String, Set < String > > stringSetEntry ) -> stringSetEntry.getValue().contains( "macbook" ) )
.findAny();
String result = entry.get().getKey();
請參閱在 IdeOne.com 上實時運行的代碼。
結果 = 筆記本電腦
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/471972.html
上一篇:我如何回圈搜索功能-python
