2017-02-23 46 views
-2

我負責以下問題:給定一組IngredientPortion(我製作的一個對象),如果IngredientPortions中的兩個元素是相同的成分(Ingredient是另一個對象,它是IngredientPortion對象的一個​​組件),我是應該結合IngredientPortion元素。例如,如果我給出的IngredientPortion數組有兩個元素,比如1.5盎司的avacodo部分和2.0 oz的另一個鱷梨部分,我應該生成一個新的IngredientPortion數組,其中包含1個元素的鱷梨: 3.5盎司。如何將具有相同關鍵字的值合併到一個哈希映射中的一個值中?

我不知道如何做到這一點,但我正在考慮使用Strings的hashmap作爲鍵,代表成分名稱和IngredientPortion對象的值。如果hashmap已經有了給定的ingredientPortion.getName()的關鍵字,那麼我會爲該關鍵字添加特定的成分比例,但我不確定如何組合成分數量。它會自動結合它還是將它作爲兩個不同的成分比例存儲在這一個鍵下?提前致謝!

+0

'map.put(duplicatePortion。getName(),新的IngredientPortion(duplicatePortion.getName(),alreadyStoredPortion.quantity + duplicatePortion.quantity)' –

+0

[HashMap在同一個鍵下具有多個值的HashMap的可能重複](http://stackoverflow.com/questions/4956844/hashmap -with-multiple-values-under-the-same-key) – nhouser9

+0

您尚未提供您現有的代碼或顯示地圖的定義,特別是輸入值的類型。它是'Double','BigDecimal'還是自定義類? –

回答

0

我使用Java 8流和groupingBy方法爲您的問題實施了兩種解決方案。我希望這能幫到您。

import java.util.*; 
import java.util.stream.Collectors; 

public class Main { 
    public static class Ingredient { 
     private final String name; 
     private final int quantity; 

     public Ingredient(String name, int quantity) { 
      Objects.requireNonNull(name); 
      this.name = name; 
      this.quantity = quantity; 
     } 

     public String getName() { 
      return name; 
     } 

     public int getQuantity() { 
      return quantity; 
     } 

     @Override 
     public String toString() { 
      return "Ingredient{" + 
        "name='" + name + '\'' + 
        ", quantity=" + quantity + 
        '}'; 
     } 
    } 

    public static void main(String[] args) { 
     Ingredient[] ingredients = new Ingredient[]{ 
      new Ingredient("banana", 1), 
      new Ingredient("cherry", 5), 
      new Ingredient("banana", 3), 
      new Ingredient("floor", 1) 
     }; 

     // First solution: Group all quantities 
     Map<String, List<Integer>> collect = Arrays.stream(ingredients) 
       .collect(Collectors.groupingBy(Ingredient::getName, 
         Collectors.mapping(Ingredient::getQuantity, Collectors.toList()) 
       )); 
     System.out.println(collect); 

     // Second solution: Sum all quantities 
     Map<String, Integer> sum = Arrays.stream(ingredients) 
       .collect(
        Collectors.groupingBy(Ingredient::getName, 
        Collectors.summingInt(Ingredient::getQuantity) 
       )); 
     System.out.println(sum); 
    } 
} 
+0

非常感謝你!我很感激 – etnie1031

+0

如果我回答你的問題,請upvote我的帖子,並單擊答案圖標;)。 –

1

如果你的hashmap存儲值,那麼你可以用它來填充一個值。此作品無論是第一成分(即它不是在地圖)或它的第二個(這需要在地圖上已經加入到價值:

map.put(ingredientKey, map.getOrDefault(ingredientKey, 0.0) + ingredientAmount); 
+0

僅適用於'Map '(或其他數字類型)。部分可能是數量和計量單位的另一個對象。 –

+0

@JimGarrison你是對的!幸運的是我設法得到了我想要的其他一些stackoverflow用戶的幫助。 – etnie1031

0

我不知道該怎麼辦這一點,但我想用字符串作爲鍵的一個HashMap,佔成份名稱,並IngredientPortion對象的值。

聽起來不錯迄今。

如果HashMap中已經有一個關鍵的給定的ingredientPortion.getName(),我會把那個特定的成分分配給那個關鍵,但我不知道如何結合成分的數量。它會自動結合它還是將它作爲兩個不同的成分比例存儲在這一個鍵下?

顯然,處理IngredientPortion時沒有問題,其名稱尚未註冊爲映射中的鍵。但是,如果密鑰已經註冊,則使用該密鑰將新值添加到地圖中將簡單替換分配給該密鑰的先前值,而不是以某種方式組合這些值。 The documentation for the Map interface應該清楚這一點。

事實上,你甚至希望Map會自動合併值,當如何這樣做,甚至是否可能這樣做取決於值的類型?聽起來像可能不確定如何形成這樣的組合。如果是這樣,那麼確定這一點就成爲你的首要任務。這也是一個特定類型的問題,所以我們無法向您提供有關細節的建議。

一旦你知道如何以合適的方式組合這些對象,使用。例如,查看地圖中的每個名稱,並根據是否找到它,插入或替換其值。

+0

非常感謝!我現在填充了地圖,但是如何將地圖的值轉換回一個包含ingredientPortion對象的數組?我嘗試使用newArray = ingredientMap.values()。toArray(),但它給了我一個錯誤消息,說不能從Object []轉換成IngredientPortion [] – etnie1031

+0

@ etnie1031,使用'Collection.toArray()'的版本, (適當類型)數組作爲它的參數。例如,'ingredientMap.values()。toArray(new IngredientPortion [ingredientMap.size()])'。 –

相關問題