operacje na kolekcjach java 8

0

Jak za pomoca stream w java 8 znalezc z posrod listy najdrozsze ciasto

kod w linku: http://wklej.org/id/1930453/

0

o_O dla każdego ciasta liczysz ile kosztuje symując wartość składników a potem wybierasz maxa.

0

No tego momentu już doszedłem , natomiast nie wiem jak to zaimplementować

0

Jak juz zgadne jak wyglądają klasy których nie raczyłeś pokazać to napisze. Pokaż kod który juz masz.

0

Może:

cakes.stream().mapToInt(Cake::countIngredientsPrice).max();

0

Pełny kod

Klasa Cake
http://wklej.org/id/1930636/

Klasa Cakes
http://wklej.org/id/1930638/

Klasa Ingredient
http://wklej.org/id/1930640/

Klasa Helper - zadania do wykonania
http://wklej.org/id/1930641/

1

Ok no to po kolei. Mamy Cake które ma liste Ingredients. Najdroższe cake to takie które ma największą sumę wartości tych ingredientów.

        return ALL.stream()
                .max(Comparator.comparing(
                        cake -> cake.getIngredients()
                                .stream()
                                .mapToInt(i -> i.getPrice())
                                .sum()
                        )
                )
                .get();

edit: Wcześniej przekombinowałem :P

    private Cake get() {
        return ALL.stream().max(Comparator.comparing(cake -> cake.getIngredients().stream().mapToInt(i -> i.getPrice()).sum())).get();
    }
3

Dla porównania, kod w Scali:

def mostExpensiveCake(cakes: Seq[Cake]): Cake = cakes.maxBy(_.ingredients.map(_.price).sum)

;]

0

Ja bym to zrobił przez redukcję:

import java.util.List;
import java.util.LinkedList;
import java.util.Optional;

class Cake{
    public Integer price;
    public Cake(Integer _price){
        price=_price;
    }
    @Override
    public String toString(){
        return "cake "+price;
    }
}

public class HelloWorld{

     public static void main(String []args){
        List<Cake> cakes = new LinkedList<>();
        cakes.add( new Cake(5) );
        cakes.add( new Cake(12) );
        cakes.add( new Cake(9) );
        cakes.add( new Cake(8) );
        Optional<Cake> maks = cakes.stream().reduce( 
            (a,b)-> a.price>b.price?a:b
        );
        maks.ifPresent( System.out::println );
     }
}

EDIT:
w sumie to i tak wychodzi na to samo co z max, bo to też jest funkcja redukująca

Optional<Cake> maks = cakes.stream().max(
    (a,b)-> a.price-b.price
);
0

Najłatwiej to będzie po prostu zsumować, tzn.

Function<Cake, Integer> indSummator = (c -> c.getIngridients().stream().mapToInt().sum());

cakes.stream()
	.map(c -> new javafx.util.Pair<>(c, indSummator.apply(c))
	.sorted((p1, p2) -> p1.getValue().compareTo(p2.getValue())
	.findFirst().get();
2

@wartek01
Ale po co sortować, by wybrać maksa? Niepotrzebnie zwiększasz złożoność obliczeniową.

0

Blokuje temat bo autor żebra o gotowca i jeszcze kasuje treści swoich postów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1