Kommunikation mellan klasser, Java

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Kommunikation mellan klasser, Java

Hejsan!

Jag har skrivit ett program (ej skolarbete) som innehåller personer och lite info om dessa.
I main finns en HashMap och en ArrayList vilka är kopplade till klassen Person.

I version ett av mitt program räknades åldern på personen ut i mainklassen, men jag skulle vilja he den delen i tex en Age-klass.

Det jag kört fast på är hur jag får input från main att hamna i Age-klassen.
Har funderat på arv, men får inte heller det att fungera:(

import java.util.*; public class Head { public static void main(String[] args){ Scanner scan = new Scanner(System.in); HashMap<String, Person>map = new HashMap<>(); //pnr som nyckel ArrayList<Person>list = new ArrayList<>(); // för att kunna söka med tex efternamn String dob, lname; int choice; Person p1 = new Person("Mia", "Wallace", "19760907-1111", "Tokyo"); Person p2 = new Person("Marcellus", "Wallace", "19720427-2222", "Miami"); Person p3 = new Person("Butch", "Coolidge", "20110818-3333", "Bogota"); list.add(p1); list.add(p2); list.add(p3); map.put("7609071111", p1); map.put("7204272222", p2); map.put("1108183333", p3); System.out.println("Sök person med personnummer: "); dob = scan.next(); System.out.println(map.get(dob)); Age ageObject = new Age(); //ny klass och objekt ageObject.counter(); // vill kunna få åldern på personen här

Tack för att du tog dig tid

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2004

Alltså, nu har jag inte kodat på bra länge men ditt tänk känns för mig lite fel. Om du vill ha ut åldern från ett personobjekt så borde du väl göra en metod i personobjektet som du kallar på? Så att du hämtar upp personobjektet från mappen och sedan bara frågar .age() typ.

Vad ska din age-klass göra förutom att ta personobjekt och räkna ut ålder? Har du någon annan tanke?

Dator 1: 6700k | 970 GTX | 2x8gb | 1xSamsung Evo 850
Dator 2: i7 930 | 7970 | 3x2048 | 1xIntel 80gb SSD
Dator 3: Q9550 | 5850 | 4x2048 PC2-8500 | 1xSamsung Evo 830, 2x1TB, 1x750GB

Trädvy Permalänk
Moderator
Plats
Linköping
Registrerad
Okt 2006

Ja, varför kan inte åldern räknas ut i Person-klassen?

Har du åsikter om moderering, frågor eller något annat kan du kontakta mig via shimonu@sweclockers.com

Trädvy Permalänk
Medlem
Plats
London / Göteborg
Registrerad
Jul 2007

@JJ72: Det känns lite som om du inte tänkt igenom.

För att hitta rätt användare så iterera över din lista, konvertera personnumret till samma format som du lagrar personnumret i personen (sk. normalisering).

Sen kapar du bort de fyra sista siffrorna, och tolkar ut datat som ett datum och räknar ut åldern.

/zyber

WS: Bärbar workstation, 2 * Dell U2412M
HTPC: Intel NUC, Canton GLE 496, Yamaha RV-A830, Sanyo PLV-Z700
Server: Intel Xeon E3-1240@3.4 GHz, ESXi, 16GB RAM, 8*2TB RAID-Z2 + SSD-cache
Slösurf: MacBook Air 11,6", Nokia Lumia 925, OnePlus Two
Kamera: Canon EOS 5DII + 1DIII, Canon 100/2.8 Macro, Canon 70-200/2.8L, Canon 24-70/2.8L

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2009

Rent spontant, vad fyller en Age klass för funktionalitet?

Som jag förstår det nu så vill du bara duplicera birthdate infon från person klassen till din Age klass, vilket innebär att du kommer skapa lika många Age object som personer som det ser ut nu, eller så förstod jag fel.

Alternativt så har du en metod i din Age klass

class Age{ ... String calculateAge(String birthInfo, Date currentDate){ //Osäker på om det är 0,7 som är rätt här String yymmdd = birthInfo.substring(0,7); /*Psudeo*/ calculate datediff return (currentDate - Date(yymmdd)).toString(); }' alt: kom på att du ej behöver current date String calculateAge(String birthInfo)... I Main: Age ageObject = new Age(); String age = ageObject.calculateAge(p1.getBirthInfo)

Men som sagt, age klassen uppfyller inte riktigt någon funktion då jag skulle säga att det är bättre att ha en metod i Person som formaterar om personnummret till en ålder i År + Månader/Dagar om man nu vill ha det.
Det är snyggare att bara anropa p1.getAge();

Däremot om din Age klass ska användas till andra saker kan du fortfarande ha den då den inte har en koppling till en Person i sig, utan bara en metod som tar en string, där kan du använda dig av överlagring om du vill ha fler parametrar.

På så sätt kan din age få mer funktionalitet, exempelvis för att beräkna skillnaden i år/månader/dagar mellan två datum som användaren matar in.

Trädvy Permalänk
Medlem
Registrerad
Dec 2014

Tack alla så jättemycket för det.

Nja, tanken med Age-klassen var nog egentligen inget annat än att försöka hålla klasserna korta och därför endast räkna ut åldern i den klassen. Vad man sedan väljer att skriva ut... tja, det får man ju som sagt välja själv

Men oavsett vilken klass uträkningen ligger i så vill jag ju map och arraylist i main. Användaren skall kunna lägga till information/personer i HashMapen och ArrayListan, därför borde det väl bli enklast/bäst att ha det där?

I min första version fick användaren mata in:
print år
print månad
print dag
print 4 sista
och så använde jag parseInt.

Nu har jag ändrat så att jag kan räkna ut direkt med personnumret (dock inte med de 4 sista siffrorna), med SimpleDateFormat.

Frågan var hur jag skulle få inmatningen i main att hamna i en annan klass (tidigare Age, numer Person )

Jag ska pröva din lösning NoToes.

Tack igen

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2009
Skrivet av JJ72:

Tack alla så jättemycket för det.

Nja, tanken med Age-klassen var nog egentligen inget annat än att försöka hålla klasserna korta och därför endast räkna ut åldern i den klassen. Vad man sedan väljer att skriva ut... tja, det får man ju som sagt välja själv

Men oavsett vilken klass uträkningen ligger i så vill jag ju map och arraylist i main. Användaren skall kunna lägga till information/personer i HashMapen och ArrayListan, därför borde det väl bli enklast/bäst att ha det där?

Nu har jag ändrat så att jag kan räkna ut direkt med personnumret (dock inte med de 4 sista siffrorna), med SimpleDateFormat.

Jag ska pröva din lösning NoToes.

Tack igen

Allt annat som inte berörde själva frågan var bara konstruktiv kritik
Tänk på att en klass bör ha ansvar för den information om det den representerar. Så t.ex i detta fallet är det rimligt att Person har ansvar för att hålla reda på sin ålder.

Citat:

Frågan var hur jag skulle få inmatningen i main att hamna i en annan klass (tidigare Age, numer Person )

Du menar hur du matar in det i en annan klass?
Antingen genom konstruktorn när du skapar objektet med getters och setters och använd en private variabel i klassen där den sparas.
eller skicka med den som en parameter till någon metod i klassen om du inte behöver spara infon.

Lösningen på hur du kan räkna ut åldern i Person på ett sätt.

import java.time.LocalDate; import java.time.Period; import java.time.format.DateTimeFormatter; class Person{ private String personnummer; Person(personnummer, ... ){//konstruktor stuff} public String getAge(){ String yymmdd... // Substring personnummer till format "yyyy-mm-dd" return calculateAge(yymmdd) } String calculateAge(String birthday){ //Låtsas att birthday = "1993-10-19"; //Formaterar datumen efter angiven sträng, denna kan du ändra på dom lagrar strängarna på annat format ex("d MM yy") DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate parsedDate = LocalDate.parse(birthday, formatter); LocalDate today = LocalDate.now(); Period p = Period.between(parsedDate, today); return "The person is " + p.getYears() + " years, "+ p.getMonths() + " months, " + p.getDays() + " days old "; } } // I Main: System.out.println(p1.getAge()); --> The person is 22 years, 1 months, 29 days old //Alternativt iterera över din lista eller map och hämta för varje element

Dold text
Trädvy Permalänk
Medlem
Registrerad
Dec 2014

@NoToes:

Aaahhhh....
Nu har jag det. Riktigt korkat av mig där, haha. Hjärnsläpp....

Tack för hjälpen än en gång NoToes