NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Reprezentace dat

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
švrčajs
Člen
Avatar
švrčajs:6.11.2016 14:46

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.11.2016 14:46
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Atrament:6.11.2016 15:27

A co Map<Ingredience, Double> ?

 
Nahoru Odpovědět
6.11.2016 15:27
Avatar
švrčajs
Člen
Avatar
Odpovídá na Atrament
švrčajs:6.11.2016 15:31

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.11.2016 15:31
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Odpovídá na švrčajs
Atrament:6.11.2016 15:36

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

 
Nahoru Odpovědět
6.11.2016 15:36
Avatar
švrčajs
Člen
Avatar
Odpovídá na Atrament
švrčajs:6.11.2016 15:38

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

 
Nahoru Odpovědět
6.11.2016 15:38
Avatar
švrčajs
Člen
Avatar
Odpovídá na Atrament
švrčajs:6.11.2016 16:49

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.11.2016 16:49
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Atrament:6.11.2016 16:57

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.11.2016 16:57
Avatar
švrčajs
Člen
Avatar
Odpovídá na Atrament
švrčajs:6.11.2016 17:17

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.11.2016 17:17
Avatar
švrčajs
Člen
Avatar
Odpovídá na Atrament
švrčajs:7.11.2016 18:39

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.11.2016 18:39
Avatar
švrčajs
Člen
Avatar
švrčajs:7.11.2016 20:13

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.11.2016 20:13
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Atrament:8.11.2016 0:16

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.11.2016 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.