Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Duplicare ArrayList con elementi multipli degli originali

    Salve,
    è possibile duplicare un ArrayList e modificarne, per esempio con un fattore moltiplicativo, tutti i suoi componenti, trattandosi di numeri?
    Ho trovato qualcosa relativamente alle shallow copy ma non le ho mai incontrate prima e non so se costituiscono la strada giusta.
    A me, a livello di concetto, interessa qualcosa del genere:
    codice:
    int n;
    ArrayList2 = new ArrayList();
    for (int i = 0; i < ArrayList1.size(); i++) {
       ArrayList2[i] = n * ArrayList1[i]
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    è possibile duplicare un ArrayList e modificarne, per esempio con un fattore moltiplicativo, tutti i suoi componenti, trattandosi di numeri?
    Ho trovato qualcosa relativamente alle shallow copy ma non le ho mai incontrate prima e non so se costituiscono la strada giusta.
    "shallow" copy, rispetto al "deep" copy, vuol solo dire in generale che data una struttura dati che viene "clonata", NON tutto viene completamente duplicato e resto distinto. Cioè certe cose restano ancora comuni e condivise tra la struttura originale e quella "clonata".

    Le collezioni Java sono clonabili (hanno il metodo clone pubblico) ma fanno solo una shallow copy. Il clone() di ArrayList restituisce un NUOVO oggetto ArrayList ma i reference contenuti sono esattamente gli stessi (proprio in termini di == ) contenuti nel ArrayList originale.
    Questo vuol dire che nel nuovo ArrayList puoi aggiungere, rimuovere, spostare i reference come vuoi e questo non cambia nulla nel ArrayList originale, perché la struttura dati in sé è distinta. Ma non gli oggetti! Se un oggetto contenuto fosse "mutabile", la modifica all'oggetto la "vedi" attraverso entrambi gli ArrayList, perché hanno lo stesso reference al medesimo oggetto mutato.

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    A me, a livello di concetto, interessa qualcosa del genere:
    codice:
    int n;
    ArrayList2 = new ArrayList();
    for (int i = 0; i < ArrayList1.size(); i++) {
       ArrayList2[i] = n * ArrayList1[i]
    }
    A parte il fatto che con ArrayList, non puoi certo indirizzare con [i], perché non è un array.

    Ma il succo/concetto comunque è proprio quello: un for e poi "per ciascun elemento" prendi il valore, moltiplichi per X e risetti il nuovo valore (o meglio inserisci in un nuovo ArrayList).

    Se vuoi lasciare intatto il ArrayList originale ed anche abbreviare il tutto, da Java 8 usi la Stream API e una lambda expression.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Da Java 8 per intenderci, esempio:

    codice:
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Collectors;
    
    public class Prova {
        public static void main(String[] args) {
            List<Integer> ints = new ArrayList<>();
            ints.add(14);
            ints.add(25);
    
            List<Integer> intsMult = ints.stream().map(v -> v*3).collect(Collectors.toList());
    
            System.out.println(ints);
            System.out.println(intsMult);
        }
    }

    Stampa:

    [14, 25]
    [42, 75]
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Codice simile l'avevo già visto su un'altra fonte, ma qualcosa non quadra adattandolo al mio caso poiché non ho valori interi bensì double, e se metto <double> me lo marca errore.

    Per inciso, io terrei anche i valori originali ma dovendoli poi passare via svg (XML "grafico/vettoriale") generato a un browser, rischio di avere valori (punti) troppo vicini e a differenza di uno script per CAD non ho un comando da console che faccia lo zoom automatico.
    Per questo cerco di "ingrandire l'output" moltiplicando le coordinate dei vari punti (gli ArrayList sono due).

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    poiché non ho valori interi bensì double
    Il "succo" praticamente non cambierebbe (quasi).

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    e se metto <double> me lo marca errore.
    Le collezioni possono contenere solo tipi reference (oggetti) ... non tipi primitivi. E i "generics" sono stati implementati solo per i tipi reference. Non è possibile mettere parametrizzazioni <int> o <double>. Al massimo <Integer> o <Double> (si intende le classi java.lang.Integer e java.lang.Double).

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    dovendoli poi passare via svg (XML "grafico/vettoriale") generato a un browser, rischio di avere valori (punti) troppo vicini e a differenza di uno script per CAD non ho un comando da console che faccia lo zoom automatico.
    Ma non vuol dire più di tanto ... dipende da come/dove viene "tirato dentro" il SVG nella pagina web. Un conto è spiattellare un SVG su un'area di 100x100 pixel e un altro conto è su 1000x1000 pixel (è questo che fa lo "zoom").

    Sui monitor desktop poi è abbastanza difficile/improbabile riuscire a "ragionare" bene in termini di misure fisiche (millimetri, pollici ecc..) e quindi alla fin fine quello che conta sono i pixel.

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Per questo cerco di "ingrandire l'output" moltiplicando le coordinate dei vari punti
    Nessuno andrebbe a fare una cosa del genere .... a meno di problematiche ben precise e da verificare.

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    (gli ArrayList sono due)
    Se uno ha le X e l'altro le Y .... ok, funziona ma in termini object-oriented sarebbe stato MOLTO più appropriato avere una lista che contiene oggetti es. Punto (con x e y).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Leggendo <Integer> avevo inteso si trattasse dei reference, ma ho sbagliato scrivendo <double> anziché <Double>...

    Le alternative al doppio ArrayList sicuramente ci sono, cerco di procedere usando strumenti coi quali ho un minimo di familiarità. Tanto più che il miglioramento è sempre possibile. In merito allo zoom dell'svg ho ragionato in parallelo allo script per CAD (probabilmente sbagliando ovvero complicando le cose), ma per aprire un svg in una finestra di browser di opportune dimensioni e fare quindi scalare il disegno vettoriale (???), immagino di dovere fornire via file jar sia un svg che un file html che lo contenga. :eek

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    ma per aprire un svg in una finestra di browser di opportune dimensioni e fare quindi scalare il disegno vettoriale (???), immagino di dovere fornire via file jar sia un svg che un file html che lo contenga. :eek
    Beh, come fornire svg e una pagina html è un altro discorso ... dipende. Cosa realizzi, una web application Java EE? O una applicazione "desktop"?

    Comunque, prima di continuare, prova questo documento HTML:

    codice:
    <!DOCTYPE html>
    <html>
    <body>
    
    <h1>Prova SVG</h1>
    
    <img src="https://openclipart.org/download/14695/Rocket000-fruit-cherries.svg" height="50">
    
    <br><br>
    
    <img src="https://openclipart.org/download/14695/Rocket000-fruit-cherries.svg" height="120">
    
    <br><br>
    
    <div style="width:300px; height:300px; overflow:scroll;">
    <img src="https://openclipart.org/download/14695/Rocket000-fruit-cherries.svg" height="600">
    </div>
    
    <br><br>
    
    </body>
    </html>

    Crea un file es. prova.html vuoto e incollaci (con Notepad, Notepad++ ecc...) il codice sopra poi apri il documento con Firefox o altro browser.

    La immagine vettoriale (presa direttamente da OpenClipArt) come vedi è scalata in vari modi. E nel terzo caso è alta 600 pixel ma è dentro un <div> dimensionato 300x300 pixel che però ha il "overflow" a scroll, che fa sì che compaiono le scrollbar, così la immagine è "scrollabile".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Il programma che sto sviluppando è quello dell'altra volta (quindi un file jar con la sua GUI...), solo che il file script per la visualizzazione grafica dei risultati è fruibile solo per chi dispone di un programma CAD, pertanto sto puntando ad aggiungere un button che compila un file svg che "organizza" le soluzioni... Quindi una volta prodotto il file svg, Java avrebbe esaurito il suo compito se la figura vettoriale risultante, opportunamente centrata sul "foglio" (le soluzioni sono distribuite attorno all'origine, che in svg è l'angolo in alto a sinistra), si adattasse alle dimensioni della finestra del browser. Ma questo a un file svg non credo di poterlo chiedere, mentre posso manipolare a monte le coordinate da raffigurare.

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    le soluzioni sono distribuite attorno all'origine, che in svg è l'angolo in alto a sinistra
    In SVG il sistema di coordinate si può "trasformare" (traslare, ruotare, ecc..). Quindi ad esempio si può fare in modo che (0,0) sia al centro del SVG e con gli assi cartesiani orientati come ci si aspetterebbe in un classico piano cartesiano.

    (è tra l'altro lo stesso concetto si può applicare al Graphics2D nel disegno in Java)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Quote Originariamente inviata da andbin Visualizza il messaggio
    In SVG il sistema di coordinate si può "trasformare" (traslare, ruotare, ecc..). Quindi ad esempio si può fare in modo che (0,0) sia al centro del SVG e con gli assi cartesiani orientati come ci si aspetterebbe in un classico piano cartesiano.
    Il che mi farebbe proprio comodo.
    Devo studiare come venire fuori dal problema dell'ingrandimento (effettivamente la moltiplicazione delle coordinate è poco elegante): la pagina web che hai proposto è di una chiarezza devastante ma, appunto, è una pagina web che nel suo codice carica un file svg, mentre io punto (almeno per ora) a produrre il file svg che poi uno apre liberamente con Firefox come con Illustrator...

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.