DOMANDA Java, confusione con le date

Paakiv

Utente Attivo
570
12
Buonasera a tutti.
Sono alle prime armi con Java e mi sono trovato con un tipo di dato Data, scusate il gioco di parole.
Semplicemente non capisco come passare in input dal main quando chiamo una nuova istanza dell'oggetto, mi da sempre errore, ma ovviamente nel costruttore è richiesta, non capisco neanche come scegliere il formato.
Un'altra cosa che ho provato a fare e la differenza tra due date e nonostante la ricerca di funzioni già pronte su Google ho avuto scarso successo.
Infine vorrei ordinare i un ArrayList i miei Oggetti in base alla data. Avete presente quando nelle cartelle del vostro pc avete molti file e potete ordinarli in base al nome, al tipo, dimensione, etc...? Ecco vorrei fare così nel mio array con la data ma poter scegliere se per mese, giorno o anno.
Cercando ho trovato solo robe con i millisecondi quindi sono parecchio confuso.
Qualcuno sa darmi delle dritte? Grazie!
 

Skills07

Head of Development
Staff Forum
Utente Èlite
35,408
11,486
CPU
Ryzen 7 5800x
Dissipatore
Deepcool gammax l240 v2
Scheda Madre
Aourus Gigabyte X-470 ultra gaming
HDD
Samsung Evo 850 250gb ,2tb x 2 toshiba P300, 256 Ssd silicon power, Samsung evo plus 1tb nvme
RAM
32 gb G.Skill Tridentz 3200 mhz RGB
GPU
Zotac - RTX 3070 Ti Trinity OC
Monitor
ASUS TUF QHD 165hz IPS, ITEK GCF 165hz IPS QHD, Samsung Curvo 144hz QHD
PSU
Seasonic Focus 650w 80 platinum
Case
Coolermaster h500p
Periferiche
Asus Tuf Wireless
Net
Fibra Tim 100mb
OS
Windows 10 Pro 64 bit
ciao puoi postare il codice incriminato??
 

Paakiv

Utente Attivo
570
12
Codice:
CLASSE

public class Persona {
    private String nome;
    private String cognome;
    private Date datanascita;
    private String luogonascita;

    public Persona(String nome, String cognome, Date datanascita, String luogonascita) {
        this.nome = nome;
        this.cognome = cognome;
        this.datanascita = datanascita;
        this.luogonascita = luogonascita;
   }

    public void bubbleSort(???) { //Voglio ordinare le istanze Persona in un array in base alla data di nascita
      ???
   }

   public ??? Differenza Date(Date d1, Date d2){
      d3 = d2-d1; //Non funziona, dovrebbe restituirmi il numero di giorni.
   }
}

ISTANZA NEL MAIN
Persona p = new Persona("Aieie", "Brazov",  ???, "Macedonia"); //Come passo la data di nascita al costruttore? "31-01-1987" non viene accettata

Ho messo solo i pezzi di codice interessati, il mio è principalmente un problema di sintassi e di poca conoscenza di funzioni che già esistono. Ho messo i punti interrogativi dove non so cosa mettere! Grazie!

PS: Non so perchè non appare indentato il codice.
 
Ultima modifica:

Skills07

Head of Development
Staff Forum
Utente Èlite
35,408
11,486
CPU
Ryzen 7 5800x
Dissipatore
Deepcool gammax l240 v2
Scheda Madre
Aourus Gigabyte X-470 ultra gaming
HDD
Samsung Evo 850 250gb ,2tb x 2 toshiba P300, 256 Ssd silicon power, Samsung evo plus 1tb nvme
RAM
32 gb G.Skill Tridentz 3200 mhz RGB
GPU
Zotac - RTX 3070 Ti Trinity OC
Monitor
ASUS TUF QHD 165hz IPS, ITEK GCF 165hz IPS QHD, Samsung Curvo 144hz QHD
PSU
Seasonic Focus 650w 80 platinum
Case
Coolermaster h500p
Periferiche
Asus Tuf Wireless
Net
Fibra Tim 100mb
OS
Windows 10 Pro 64 bit
Usa il tag codice per inserire il codice
 

Skills07

Head of Development
Staff Forum
Utente Èlite
35,408
11,486
CPU
Ryzen 7 5800x
Dissipatore
Deepcool gammax l240 v2
Scheda Madre
Aourus Gigabyte X-470 ultra gaming
HDD
Samsung Evo 850 250gb ,2tb x 2 toshiba P300, 256 Ssd silicon power, Samsung evo plus 1tb nvme
RAM
32 gb G.Skill Tridentz 3200 mhz RGB
GPU
Zotac - RTX 3070 Ti Trinity OC
Monitor
ASUS TUF QHD 165hz IPS, ITEK GCF 165hz IPS QHD, Samsung Curvo 144hz QHD
PSU
Seasonic Focus 650w 80 platinum
Case
Coolermaster h500p
Periferiche
Asus Tuf Wireless
Net
Fibra Tim 100mb
OS
Windows 10 Pro 64 bit
In primis per il metodo sulle date cosa vuoi che ti restituisca?? Dato che e una differenza credo tu debba fare il metodo public int datadifferenza(Date a, date b){}

Chiaramente dentro il metodo dovrai estrarre i vari valori dalle date e restituire la differenza tra a e b

Poi x ordinare un vettore puoi usare vari algoritmi di ordinamento tra cui insertion sort bubblesort bucketsort quicksort e via via dicendo ricordando le varie notazioni di algoritmi

Poi per creare un nuovo oggetto di tipo persona passi come variabili tutti gli attributi che ti servono
 

icox

Utente Attivo
497
246
Se vuoi usare una Date devi istanziarla da qualche parte, puoi farlo nel main (o dove ti pare) con un new Date() oppure all'interno del costruttore di Persona. Nel primo caso puoi tenere il costruttore di Persona cosi come lo hai definito, nel secondo dovrai modificare la firma passando passando invece una stringa e facendo quindi la new successivamente.
La comparazione puoi farla usando i metodi di Date (qui trovi tutto) senza reinventare la ruota.
Infine per ordinarli, assumendo che tu sappia implementare un qualche algoritmo di ordinamento, puoi fare un metodo getDate che ritorna la data di nascita e quindi lo confronti con l'opportuno metodo di cui sopra.

Occhio che molti metodi di Date sono deprecati - tra cui Date(int year, int month, int date, int hrs, int min) - e sarebbe quindi meglio abbandonarli. Qui altre informazioni
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,912
11,561
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
la classe Date è sconsigliata insieme a tutti i suoi metodi, inoltre non permette di fare operaziooni di differenza tra date (come in SQL);
dai un'occhiata alle classi LocalDate e/o LocalDateTime in java.time
 

Paakiv

Utente Attivo
570
12
Mi sono spiegato male.
La differenza tra date dovrebbe restit
In primis per il metodo sulle date cosa vuoi che ti restituisca?? Dato che e una differenza credo tu debba fare il metodo public int datadifferenza(Date a, date b){}

Chiaramente dentro il metodo dovrai estrarre i vari valori dalle date e restituire la differenza tra a e b

Poi x ordinare un vettore puoi usare vari algoritmi di ordinamento tra cui insertion sort bubblesort bucketsort quicksort e via via dicendo ricordando le varie notazioni di algoritmi

Poi per creare un nuovo oggetto di tipo persona passi come variabili tutti gli attributi che ti servono

Mi sono spiegato male.
La differenza tra date dovrebbe restituirmi il numero in giorni suppongo, o non so se si può in altri formati, dovrebbe essere int.
Il problema è che quando chiamo la funzione o Persona nel main, al campo Date datanascita non so cosa dare, come scrivere questa data: gg/mm/aaaa, gg/mm/aa, "aa/mm/gg" etc...
Gli algoritmi di ordinamento li conosco, li ho impararti al mio primi approccio alla programmazione, in C, anche se a memoria non li ricordo. Li so usare per gli int. Volendo ordinare le Persona nell'array in base alla data, come passo il parametro e modifico il codice affinchè utilizzi la data e non l'int?
 

Skills07

Head of Development
Staff Forum
Utente Èlite
35,408
11,486
CPU
Ryzen 7 5800x
Dissipatore
Deepcool gammax l240 v2
Scheda Madre
Aourus Gigabyte X-470 ultra gaming
HDD
Samsung Evo 850 250gb ,2tb x 2 toshiba P300, 256 Ssd silicon power, Samsung evo plus 1tb nvme
RAM
32 gb G.Skill Tridentz 3200 mhz RGB
GPU
Zotac - RTX 3070 Ti Trinity OC
Monitor
ASUS TUF QHD 165hz IPS, ITEK GCF 165hz IPS QHD, Samsung Curvo 144hz QHD
PSU
Seasonic Focus 650w 80 platinum
Case
Coolermaster h500p
Periferiche
Asus Tuf Wireless
Net
Fibra Tim 100mb
OS
Windows 10 Pro 64 bit
decidi tu lo string format della data puoi scriverla in diversi modi ad esempio

yyyy-mm-dd:HH-mm-ss oppre yyyy-mm-dd oppure yyyy/mm/dd oppure dd-mm-yyyy

se cerchi su google trovi miliardi di esempi

ad esempio

Codice:
public class DatesDiff {
   public static void main(String[] args) {
       try {
           String strDate1 = "2007/04/15 12:35:05";
           String strDate2 = "2009/08/02 20:45:07";

           SimpleDateFormat fmt = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
           fmt.setLenient(false);

           // Parses the two strings.
           Date d1 = fmt.parse(strDate1);
           Date d2 = fmt.parse(strDate2);

           // Calculates the difference in milliseconds.
           long millisDiff = d2.getTime() - d1.getTime();

           // Calculates days/hours/minutes/seconds.
           int seconds = (int) (millisDiff / 1000 % 60);
           int minutes = (int) (millisDiff / 60000 % 60);
           int hours = (int) (millisDiff / 3600000 % 24);
           int days = (int) (millisDiff / 86400000);

           System.out.println("Between " + strDate1 + " and " + strDate2 + " there are:");
           System.out.print(days + " days, ");
           System.out.print(hours + " hours, ");
           System.out.print(minutes + " minutes, ");
           System.out.println(seconds + " seconds");
       } catch (Exception e) {
           System.err.println(e);
       }
   }
}
 

Paakiv

Utente Attivo
570
12
Se vuoi usare una Date devi istanziarla da qualche parte, puoi farlo nel main (o dove ti pare) con un new Date() oppure all'interno del costruttore di Persona. Nel primo caso puoi tenere il costruttore di Persona cosi come lo hai definito, nel secondo dovrai modificare la firma passando passando invece una stringa e facendo quindi la new successivamente.
La comparazione puoi farla usando i metodi di Date (qui trovi tutto) senza reinventare la ruota.
Infine per ordinarli, assumendo che tu sappia implementare un qualche algoritmo di ordinamento, puoi fare un metodo getDate che ritorna la data di nascita e quindi lo confronti con l'opportuno metodo di cui sopra.

Occhio che molti metodi di Date sono deprecati - tra cui Date(int year, int month, int date, int hrs, int min) - e sarebbe quindi meglio abbandonarli. Qui altre informazioni
Quindi dovrei fare Persona p = new Persona ("Pinco", "Pallino", new Date(06-02-2018) , "Venezia") ?
Non riesco a trovare la comparazione nel link che mi hai mandato. Provo quello che mi ha scritto l'utente sotto di te
 

Skills07

Head of Development
Staff Forum
Utente Èlite
35,408
11,486
CPU
Ryzen 7 5800x
Dissipatore
Deepcool gammax l240 v2
Scheda Madre
Aourus Gigabyte X-470 ultra gaming
HDD
Samsung Evo 850 250gb ,2tb x 2 toshiba P300, 256 Ssd silicon power, Samsung evo plus 1tb nvme
RAM
32 gb G.Skill Tridentz 3200 mhz RGB
GPU
Zotac - RTX 3070 Ti Trinity OC
Monitor
ASUS TUF QHD 165hz IPS, ITEK GCF 165hz IPS QHD, Samsung Curvo 144hz QHD
PSU
Seasonic Focus 650w 80 platinum
Case
Coolermaster h500p
Periferiche
Asus Tuf Wireless
Net
Fibra Tim 100mb
OS
Windows 10 Pro 64 bit
si oppure crei la data prima e la passi al costruttore

esempio

Date datanasc = new Date("01-01-2000");
Persona p = new Persona("Pippo", "pluto", datanasc, "Varese");
 

Skills07

Head of Development
Staff Forum
Utente Èlite
35,408
11,486
CPU
Ryzen 7 5800x
Dissipatore
Deepcool gammax l240 v2
Scheda Madre
Aourus Gigabyte X-470 ultra gaming
HDD
Samsung Evo 850 250gb ,2tb x 2 toshiba P300, 256 Ssd silicon power, Samsung evo plus 1tb nvme
RAM
32 gb G.Skill Tridentz 3200 mhz RGB
GPU
Zotac - RTX 3070 Ti Trinity OC
Monitor
ASUS TUF QHD 165hz IPS, ITEK GCF 165hz IPS QHD, Samsung Curvo 144hz QHD
PSU
Seasonic Focus 650w 80 platinum
Case
Coolermaster h500p
Periferiche
Asus Tuf Wireless
Net
Fibra Tim 100mb
OS
Windows 10 Pro 64 bit
ci sono vari modi di interpretare le date
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili