Moltiplicazione tra due Stream

di il
12 risposte

Moltiplicazione tra due Stream

Salve a tutti, sono alle prime armi con l'uso di Stream.

Dovrei fare:
- uno stream di un ArrayList
- limitarlo dell'ultimo elemento
- moltiplicare ogni singolo elemento per gli elementi di un Array (e quindi credo creare un nuovo stream)
- poi sommare tutti gli elementi risultanti

Avevo pensato a qualcosa del genere ma non riesco a venirne fuori..
		double sommatoria = matricePesi[i][j].stream()
							.limit(matricePesi[i][j].size()-1)
							.map(x -> Arrays.stream(values).map(y -> x*y))
							.mapToDouble(null)
							.sum();

12 Risposte

  • Re: Moltiplicazione tra due Stream

    Zed92 ha scritto:


    Dovrei fare:
    - uno stream di un ArrayList
    - limitarlo dell'ultimo elemento
    - moltiplicare ogni singolo elemento per gli elementi di un Array (e quindi credo creare un nuovo stream)
    - poi sommare tutti gli elementi risultanti
    Non mi è molto chiaro .... il ArrayList che cosa contiene? Cosa è matricePesi (che usi con 2 indici) nel codice mostrato? Cosa intendi per "limitarlo dell'ultimo elemento"? Intendi escludere l'ultimo elemento o prendere solo l'ultimo elemento?

    P.S. .mapToDouble(null) comunque non ha senso
  • Re: Moltiplicazione tra due Stream

    L'ArrayList matricePesi contiene un' insieme con dentro dei double
    Per limitarlo dell'ultimo elemento intendo escluderlo dell'ultimo elemento

    mapToDouble(null) volevo utilizzarlo nella speranza di convertire lo stream in un DoubleStream e poi fare la somma.
  • Re: Moltiplicazione tra due Stream

    Zed92 ha scritto:


    L'ArrayList matricePesi contiene un' insieme con dentro dei double
    matricePesi è un java.util.ArrayList quindi? Allora NON ha senso "indicizzarlo" così matricePesi[j]
  • Re: Moltiplicazione tra due Stream

    andbin ha scritto:


    Zed92 ha scritto:


    L'ArrayList matricePesi contiene un' insieme con dentro dei double
    matricePesi è un java.util.ArrayList quindi? Allora NON ha senso "indicizzarlo" così matricePesi[j]


    Mi serviva un ArrayList di ArrayList in modo tale da avere lo stesso effetto Array di Array (ovvero Matrice), ma sottoforma di ArrayList.

    Quindi matricePesi è un ArrayList in cui ogni singola cella contiene al suo interno un Set di Double.

    Ovviamente gli indici i e j fanno riferimento a due cicli annidati che ho utilizzato esternamente per leggere matricePesi.

    Perchè non ha senso indicizzarlo cosi?
  • Re: Moltiplicazione tra due Stream

    Zed92 ha scritto:


    Mi serviva un ArrayList di ArrayList in modo tale da avere lo stesso effetto Array di Array (ovvero Matrice), ma sottoforma di ArrayList.

    Quindi matricePesi è un ArrayList in cui ogni singola cella contiene al suo interno un Set di Double.

    Ovviamente gli indici i e j fanno riferimento a due cicli annidati che ho utilizzato esternamente per leggere matricePesi.

    Perchè non ha senso indicizzarlo cosi?
    Quindi da qualche parte hai un

    ArrayList<Set<Double>> matricePesi;

    giusto? Ovvero un ArrayList in cui ogni elemento è un "set" di Double.

    Se così bene. Cioè male nel senso che matricePesi[j] NON ha senso, perché non è array ma una collezione e si usa il metodo get(indice) sulle liste (e i Set invece NON sono nemmeno "indicizzabili" per indice!).

    Quindi tu vuoi escludere l'ultimo elemento del ArrayList ovvero l'ultimo Set ... o l'ultimo Double dell'ultimo Set?
    Scusa ma se non precisi bene le cose possiamo stare qui fino a mezzogiorno di domani ...
  • Re: Moltiplicazione tra due Stream

    andbin ha scritto:


    ArrayList<Set<Double>> matricePesi;

    giusto? Ovvero un ArrayList in cui ogni elemento è un "set" di Double.

    Se così bene. Cioè male nel senso che matricePesi[j] NON ha senso, perché non è array ma una collezione e si usa il metodo get(indice) sulle liste (e i Set invece NON sono nemmeno "indicizzabili" per indice!).

    Quindi tu vuoi escludere l'ultimo elemento del ArrayList ovvero l'ultimo Set ... o l'ultimo Double dell'ultimo Set?
    Scusa ma se non precisi bene le cose possiamo stare qui fino a mezzogiorno di domani ...


    1) Non proprio, io dichiaro la matrice cosi: ArrayList<Double>[][] matricePesi; (in quanto è un ArrayList di ArrayList come dicevo)
    Gli elementi della matricePesi sono degli insiemi Set, ma per accederci non devo per forza dichiararli.
    Posso quindi accedere a tutti i metodi dell'insieme Set in questione facendo matricePesi[j].nomeMetodo();

    2) Voglio escludere l'ultimo double contenuto nell'insieme che è contenuto nella cella della matrice matricePesi[i-esima][j-esima] presa in esame.
  • Re: Moltiplicazione tra due Stream

    Zed92 ha scritto:


    1) Non proprio, io dichiaro la matrice cosi: ArrayList<Double>[][] matricePesi; (in quanto è un ArrayList di ArrayList come dicevo)
    No, NON è un "ArrayList di ArrayList". È un array bidimensionale in cui ogni cella è un ArrayList<Double>. Quindi in pratica è a 3 "dimensioni"!!

    Zed92 ha scritto:


    Gli elementi della matricePesi sono degli insiemi Set, ma per accederci non devo per forza dichiararli.
    Scusa ma tu il "Set" dove lo vedi?? Io non vedo alcun Set!

    Zed92 ha scritto:


    Posso quindi accedere a tutti i metodi dell'insieme Set in questione facendo matricePesi[j].nomeMetodo();

    Sì, allora con quanto hai detto adesso, matricePesi[j] HA senso perché è un array bidimensionale. E quindi matricePesi[j] è un singolo ArrayList<Double>.

    Zed92 ha scritto:


    2) Voglio escludere l'ultimo double contenuto nell'insieme che è contenuto nella cella della matrice matricePesi[i-esima][j-esima] presa in esame.

    Se per insieme intendi il ArrayList ok.
  • Re: Moltiplicazione tra due Stream

    Si hai ragione è un ArrayList<Double> come dicevi. (ho avuto un lapsus)

    Come procediamo quindi?
  • Re: Moltiplicazione tra due Stream

    Zed92 ha scritto:


    Come procediamo quindi?
    Allora:
    matricePesi[j].stream() è Ok
    e
    .limit(matricePesi[j].size()-1) è anche Ok

    A quel punto hai un Stream<Double> di size-1 elementi (uno in meno in pratica).

    Se ciascuno di questi elementi lo devi moltiplicare per i valori di un altro array, allora devi sicuramente fare un flatMap, perché poi devi "appiattire" più stream in un unico stream. In modo specifico puoi usare un flatMapToDouble.

    Giusto come esempio (NON è esattamente quello che serve a te):

    ArrayList<Double> list = new ArrayList<>(Arrays.asList(10.0, 11.0, 12.0));   // solo come esempio
    
    double[] arr = { 2, 3 };
    
    double[] result = list.stream()
        .flatMapToDouble(listVal -> Arrays.stream(arr).map(arrVal -> arrVal * listVal))
        .toArray();
    
    System.out.println(Arrays.toString(result));
    Vedi che il risultato è: [20.0, 30.0, 22.0, 33.0, 24.0, 36.0]

    Ovvero: 10*2 e 10*3 poi 11*2 e 11*3 ecc...
  • Re: Moltiplicazione tra due Stream

    Ci siamo quasi Io però dovrei moltiplicare gli elementi tra i due stream in corrispondenza..

    Quindi ad esempio se ho stream1(10,20,30) e ho stream2(1,2,3) allora avrò stream3(10,40,90). (ovviamente i due stream hanno garantita la stessa cardinalità)
    Come posso fare?
  • Re: Moltiplicazione tra due Stream

    Zed92 ha scritto:


    Ci siamo quasi Io però dovrei moltiplicare gli elementi tra i due stream in corrispondenza..
    Ah ok ... quando hai detto "moltiplicare ogni singolo elemento per gli elementi di un Array" io avevo inteso appunto le varie combinazioni possibili.
    Non avevo inteso: linearmente, per lo stesso indice.

    Allora non è immediato, perché la Stream API non ha purtroppo il costrutto "zip" (come invece ha Kotlin e altri linguaggi funzionali).
    Ti conviene forse ragionare per indici. Invece di un Stream degli elementi, un IntStream con gli indici (IntStream.range) e poi usarli per accedere a ArrayList e array alla stessa posizione. Non è il massimo ma si fa ....
  • Re: Moltiplicazione tra due Stream

    andbin ha scritto:


    Zed92 ha scritto:


    Ci siamo quasi Io però dovrei moltiplicare gli elementi tra i due stream in corrispondenza..
    Ah ok ... quando hai detto "moltiplicare ogni singolo elemento per gli elementi di un Array" io avevo inteso appunto le varie combinazioni possibili.
    Non avevo inteso: linearmente, per lo stesso indice.

    Allora non è immediato, perché la Stream API non ha purtroppo il costrutto "zip" (come invece ha Kotlin e altri linguaggi funzionali).
    Ti conviene forse ragionare per indici. Invece di un Stream degli elementi, un IntStream con gli indici (IntStream.range) e poi usarli per accedere a ArrayList e array alla stessa posizione. Non è il massimo ma si fa ....
    Menomale che ho chiesto
    Comunque facendo uno IntStream.range come hai suggerito ho risolto grazie
Devi accedere o registrarti per scrivere nel forum
12 risposte