Do nového roku jako lepší programátoři? Znovu otevíráme večerní školu programování. Nette framework, návrhové vzory, testování nebo vůbec poprvé kurzy ASP.NET dostupné odkudkoli v republice.

Diskuze: Reprezentace dat

Java Java Reprezentace dat

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.11.2016 14:46
Avatar
Atrament
Člen
Avatar
Atrament:

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:

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