Avatar
švrčajs
Člen
Avatar
švrčajs:

Zdravím, mám takový menší dotaz, jak reprezentovat data. Jedná se o to, mám napsat jednoduchou "kuchařku", skládající se ze dvou tříd (recept a ingredience) recept má obsahovat seznam ingrediencí a jejich potřebné množství a z tohoto pak vychází další funkce. Napadlo mě použít Map<string, double>... ale to neodpovídá seznamu. Chtěl bych se zeptat, jak to reprezentovat :D Protože, bez toho se nehnu dál...

 
Odpovědět 6. listopadu 14:46
Avatar
Atrament
Člen
Avatar
Atrament:

A co Map<Ingredience, Double> ?

 
Nahoru Odpovědět 6. listopadu 15:27
Avatar
švrčajs
Člen
Avatar
Odpovídá na Atrament
švrčajs:

No, jasné :D ale jde mi o to, zda se i Map považuje za seznam, automatiky beru seznam jako List.. Případně mě napadlo, udělat list z párů <ingredience, množství>. Ale pak následné funkce mají využívat jen stream API, takže potřebuju co nejjednodušší řešení, aby s tím pak nebyli komplikace, ohledně těch streamů... Jsem v tom naprostý zelenáč..

 
Nahoru Odpovědět 6. listopadu 15:31
Avatar
Atrament
Člen
Avatar
Odpovídá na švrčajs
Atrament:

Aha, jo jasně, streamy na tom normálně fungují úplně stejně jako na Listech pokud vím.

 
Nahoru Odpovědět 6. listopadu 15:36
Avatar
švrčajs
Člen
Avatar
Odpovídá na Atrament
švrčajs:

Ok, zkusím si s tím pohrát, díky moc :D

 
Nahoru Odpovědět 6. listopadu 15:38
Avatar
švrčajs
Člen
Avatar
Odpovídá na Atrament
švrčajs:

Tak :D a už jsem narazil na problém, mé "oblíbené" lambda výrazy :D mám problém s tím, jak vytáhnu pomocí map více informací :D přesněji viz kod... Podaří se mi vypsat název suroviny :D ale nejde mi už vypsat k tomu měrnou jednotku(unit) a počet, který bude potřeba :D Nějaký nápad, jak to vytáhnout ?

Ingredient i = new Ingredient();
        i.setName("maso");
        i.setPrice(100);
        i.setUnit("kg");
        Map<Ingredient, Integer> recipe = new HashMap<>();
        recipe.put(i, 10);

        String temp = recipe.entrySet()
                            .stream()
                            .map(n -> n.getKey().getName())
                .collect(Collectors.joining(", "));
        System.out.println(temp);
 
Nahoru Odpovědět 6. listopadu 16:49
Avatar
Atrament
Člen
Avatar
Atrament:

Použil bych forEach

recipe.entrySet().forEach((e) -> {
  System.out.println(e.getKey().getName() + " " + e.getValue() + " " + e.getKey().getUnit());
}

Snad jsem se nezamotal v těch závorkách jak mívám ve zvyku, píšu to naslepo bez vyzkoušení :)

 
Nahoru Odpovědět 6. listopadu 16:57
Avatar
švrčajs
Člen
Avatar
Odpovídá na Atrament
švrčajs:

Potřebuju to vrátit jako string právě, mám přepsat metodu toString()... vyřešil jsem to takto :D

String temp;
        temp = recipe.entrySet()
                .stream()
                .map(n -> n.getKey().getName() + " " + n.getValue().toString() + " " + n.getKey().getUnit())
                .collect(Collectors.joining(" "));

bude s tím ještě hodně srandy :D

 
Nahoru Odpovědět 6. listopadu 17:17
Avatar
švrčajs
Člen
Avatar
Odpovídá na Atrament
švrčajs:

Můžu se ještě poptat, jak řešit nejdražší položku receptu ? Zatím to mám vyřešené takto

public Ingredient getTheMostExpensiveIngredient(){
        Ingredient temp = recipe.entrySet()
               .stream()
               .max(Map.Entry.comparingByValue())
               .get().getKey();
        return temp;
    }

ale tohle mi vrací položku, která je nejvíce drahá v receptu..

 
Nahoru Odpovědět 7. listopadu 18:39
Avatar
švrčajs
Člen
Avatar
švrčajs:

Nakonec jsem to vyřešil takto

public Ingredient getTheMostExpensiveIngredient(){
        Map<Ingredient, Double> temp;
        temp = recipe.entrySet()
                .stream()
                .collect(HashMap<Ingredient, Double>::new, (m,e) -> m.put(e.getKey(), e.getValue() * e.getKey().getPrice()), Map::putAll);
       return temp.entrySet()
               .stream()
               .max(Map.Entry.comparingByValue())
               .get().getKey();
    }
 
Nahoru Odpovědět 7. listopadu 20:13
Avatar
Atrament
Člen
Avatar
Atrament:

Taky jsi to mohl zkusit takto

Entry maxEntry = recipe.entrySet().stream()
    .max(Comparator.comparingInt((e) -> e.getKey().getPrice() * e.getValue()))
    .get();
Ingredient mostExpensive = (Ingredient)maxEntry.getKey();
 
Nahoru Odpovědět 8. listopadu 0:16
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.