Gå til innhold

Returnere flere verdier fra en metode?


Anbefalte innlegg

Er det mulig å returnere flere verdier fra samme metode? f.eks to Stringer eller to int-verdier?

 

Har også et annet lite problem med følgende programkode:

void regNyPerson(){

Person nyPerson = new Person();

pu.beOmPersonOpplysninger(nyPerson);

m.leggTilPerson(nyPerson);

 

alt går strålende til m.leggTilPerson(nyPerson). I den metoden står det følgende:

if(nyPerson.hentKjønn().equals("k")){

nyPerson = new Kvinne();

System.out.println("Ny kvinne laget");

}else if(nyPerson.hentKjønn().equals("m")){

nyPerson = new Mann();

System.out.println("Ny Mann laget");

}else {

System.out.println("Du har dessverre tastet inn ugyldig kjønn");

}

 

men dette får jeg ikke lov til av kompilatoren. Får feilmeldingen

cannot find symbol class Kvinne

location: class modell

 

Greia er at modellklassen skal teste om nyPerson er kvinne eller mann og deretter opprette et kvinne eller mann objekt som er en subklasse av class Person. Den skal selvsagt ha de samme variablene som personen hadde fra før, altså navn, kjønn, navnet på mor og navnet på far.

 

Takker for all hjelp :)

Lenke til kommentar
Videoannonse
Annonse

Du kan returnere et array av type String eller int, men for å returnere flere av samme type må de ligge i et array, det er derimot ikke mulig å returnere to instanser av forskjellig type.

 

Når det gjelder det andre spørsmålet ditt er det umulig å svare på uten å ha resten av koden din. Når du legger den ut, bruk

 blokker slik at tabs osv. ikke blir ignorert.
Endret av NevroMance
Lenke til kommentar

import java.util.*;
import java.io.*;
import easyIO.*;

class Personkontroll {
  PersonUtsyn pu = new PersonUtsyn();
  Modell m = new Modell();

void regNyPerson(){
   Person nyPerson = new Person();
   pu.beOmPersonOpplysninger(nyPerson);
   m.leggTilPerson(nyPerson);
}
void visPerson(){
String navn = pu.beOmNavn();
//m.giPerson(navn);
}
void nyForesatt(){
String navnforesatt = pu.beOmNyFarEllerMor();
}
void regEkteskap(){
String mannen = "";
String kvinnen = "";
pu.beOmBrud(kvinnen);
pu.beOmBrudgom(mannen);
}
void regSkilsmisse(){
String mannen = "";
String kvinnen = "";
pu.beOmSkilsmissekvinnen(kvinnen);
pu.beOmSkilsmissemannen(mannen);
}
void skrivTilFil(){
}
void lesFraFil(){
}
void flestBarn(){
}
void skrivSøsken(){
}
void finnSøskenBarn(){
}
   void meny(){
int valg = pu.kommando();
while(valg != 0) {
    switch(valg) {
    case 1: regNyPerson();break;
    case 2: visPerson();break;
    case 3: nyForesatt();break;
    case 4: regEkteskap();break;
    case 5: regSkilsmisse();break;
    case 6: skrivTilFil();break;
    case 7: lesFraFil();break;
    case 8: flestBarn();break;
    case 9: skrivSøsken();break;
    case 10: finnSøskenBarn();break;
    default: pu.skrivFeil();
    }
    valg = pu.kommando();
}
   } //end meny
} //end class PersonKontroll

class PersonUtsyn {
   Out ut;
   In tast;
   String navn;

   PersonUtsyn() {
tast = new In();
ut = new Out();
   }

   public int kommando(){
ut.outln("Velkommen til slektskapsregisteret for Ruritania");
ut.outln("**** Dette er menyen ****");
ut.outln("1 - Registrer ny person");
ut.outln("2 - Vis en valgt person");
ut.outln("3 - Registrer ny Far/Mor");
ut.outln("4 - Registrer ekteskap");
ut.outln("5 - Registrer skilsmisse");
ut.outln("6 - Skriv informasjon til fil");
ut.outln("7 - Les informasjon fra fil");
ut.outln("8 - List over flest egne barn");
ut.outln("9 - Finn søsken til en person");
ut.outln("10 - Finn fetter/kusine til en person");
ut.outln("0 - Avslutt systemet");
ut.out("Tast inn ditt valg: ");
return(tast.inInt());
   }

   public Person beOmPersonOpplysninger(Person nyPerson){
	ut.out("Tast inn navnet på personen: ");
	String navn = tast.inWord();
	nyPerson.settNavn(navn);
	ut.out("Tast inn kjønnet på personen (m/k): ");
	String kjønn = tast.inWord();
	nyPerson.settKjønn(kjønn);
	ut.out("Tast inn navnet til personens mor: ");
	String navnmor = tast.inWord();
	nyPerson.settNavnMor(navnmor);
	ut.out("Tast inn navnet til personen far: ");
	String navnfar = tast.inWord();
	nyPerson.settNavnFar(navnfar);
	return nyPerson;
}
public String beOmNavn(){
	ut.out("Tast inn navnet på personen som du vil se opplysningene til: ");
	return tast.inWord();
}
public String beOmNyFarEllerMor(){
return tast.inWord();
}
public String beOmBrudgom(String mannen){
	ut.out("Tast inn navnet på mannen som skal gifte seg: ");
	mannen = tast.inWord();
	return mannen;
}
public String beOmBrud(String kvinnen){
ut.out("Tast inn navnet på kvinnen som skal gifte seg: ");
kvinnen = tast.inWord();
return kvinnen;
}
public String beOmSkilsmisseKvinne(String kvinnen){
ut.out("Tast inn navnet på kvinnen som skal skille seg: ");
kvinnen = tast.inWord();
return kvinnen;
}
public String beOmSkilsmisseMann(String mannen){
ut.out("Tast inn navnet på mannen som skal skille seg: ");
mannen = tast.inWord();
return mannen;
}
public void skrivFeil(){
	ut.outln("Du har skrevet noe feil. Vanligst prøv igjen");
	return;
}
} //end class PersonUtsyn

class Person {
 	private String navn;
   private String kjønn;
   private boolean gift;
   private String far;
   private String mor;
   private String ektefelle;

   //get/set metoder for alle variablene
   void settNavn(String navn){
this.navn = navn;
   }
   void settKjønn(String kjønn){
   this.kjønn = kjønn;
   }
   void settNavnMor(String navnmor){
   	mor = navnmor;
   }
   void settNavnFar(String navnfar){
   	far = navnfar;
   }
   String hentNavn(){
   	return this.navn;
   }
   String hentKjønn(){
   	return this.kjønn;
   }
   String hentNavnFar(){
   	return this.far;
   }
   String hentNavnMor(){
   	return this.mor;
   }
Person (){
}

   class Mann extends Person {
	//HashMap<String, Person> barnMenn = new Hashmap<String, Person>();

   }

   class Kvinne extends Person {
	String[] barnKvinner = new String[10];
	int antbarn = 0;
   }
} //end class Person


/**
* Dette grensesnittet skal implementeres av modellklassen.
* Implementasjonen av metodene skal kun gjøre enkle operasjoner med personregisteret.
* Kontrollklassen skal kun aksessere dataene i modellen via disse metodene.
*/
interface Modell_grensesnitt {


   /**
    * Henter en person fra personregisteret.
    *
    * @param     navn   navn på person
    * @return    person-objektet til personen med navn "navn".
    *            Hvis personen ikke eksisterer returneres null
    */
public Person giPerson(String navn);

   /**
    * Registrerer en ny person i personregisteret.
    *
    * @param     nyPerson   den nye personen som skal legges inn i personregisteret
    * @return    feilmelding som en string. Hvis ingen feil oppstår returneres null
    */
   public String leggTilPerson(Person nyPerson);


   /**
    * Fjerner en person fra personregisteret.
    *
    * @param     navn   navn på person
    * @return    feilmelding som en string. Hvis ingen feil oppstår returneres null
    */
   public String fjernPerson(String navn);


   /**
    * Registrerer ekteskap mellom en mann og en kvinne.
    *
    * @param     mann     navn på mann
    * @param     kvinne   navn på kvinne
    * @return    feilmelding som en string. Hvis ingen feil oppstår returneres null
    */
   public String registrerEkteskap(String mann, String kvinne);


   /**
    * Registrerer skillsmisse mellom en mann og en kvinne.
    *
    * @param     mann     navn på mann
    * @param     kvinne   navn på kvinne
    * @return    feilmelding som en string. Hvis ingen feil oppstår returneres null
    */
   public String registrerSkilsmisse(String mann, String kvinne);


   /**
    * Registrer en ny far eller ny mor for en person.
    *
    * @param     person         navn på person som får registrert ny far eller mor
    * @param     nyFarEllerMor  navn på den nye faren eller moren
    * @param     mor            angir om det er en ny far eller ny mor som skal registreres
    * @return    feilmelding som en string. Hvis ingen feil oppstår returneres null
    */
   public String nyFarEllerMor(String person, String nyFarEllerMor, boolean mor);
}




/**
* Denne klassen holder orden på dataene i slektskapsregisteret.
* Den tilgjengeligjør de nødvendige metodene for å registrere og fjerne personer,
* samt enkle operasjoner på dataene.
*
* Denne klassen skal holdes helt adskilt fra utsynklassen.
*
* @author ditt navn
*/
class Modell {/**implements Modell_grensesnitt { */
private HashMap <String, Person> personregister = new HashMap <String, Person>();

//public Person giPerson(String navn){

//}

public String leggTilPerson(Person nyPerson){
if(nyPerson.hentKjønn().equals("k")){
	nyPerson = new Kvinne();
   System.out.println("Ny kvinne laget");
 }else if(nyPerson.hentKjønn().equals("m")){
	 nyPerson = new Mann();
	 System.out.println("Ny Mann laget");
 }else {
	 System.out.println("Du har dessverre tastet inn ugyldig kjønn");
 }
 String bra = ("Alt har gått bra og personen er registrert");
 return bra;
}
/**public String fjernPerson(String navn){

}
public String registrerEkteskap(String mann, String kvinne){

}
public String registrerSkilsmisse(String mann, String kvinne){

}
public String nyFarEllerMor(String person, String nyFarEllerMor, boolean mor){

} */

}

/**
* Dette er klassen med main-metoden.
* Dette er den eneste klassen som skal være public.
*
* @author ditt navn
*/
public class Oblig1 {
   public static void main (String [] args) {
Personkontroll pk = new Personkontroll();
pk.meny();
   }
}

 

Det var resten av koden :) takk for hjelp!

Lenke til kommentar

Problemet ditt kommer av at Kvinne og Mann ligger som underklasser av Person, noe som for så vidt ikke er nødvendig. Hvis du klipper de ut utenfor Person-klassen din skal det gå fint. Siden Kvinne og Mann arver fra Person vil de også ha tilgang til de samme metodene. Slik som det er nå er det kun Personobjekter som kan lage Kvinner og Menn.

Lenke til kommentar

Det er et krav at Kvinne og Mann er underklasser av Person.

 

Mente subklasser! Skjønner hva du mener nå :) takk!

 

Kjapt spørsmål til:

Hvorfor får jeg feilmelding når jeg har HashMap i class Mann extends Person?

cannot find symbol class HashMap

Location: class Mann

Endret av Benbjo
Lenke til kommentar
Kjapt spørsmål til:

Hvorfor får jeg feilmelding når jeg har HashMap i class Mann extends Person?

cannot find symbol class HashMap

Location: class Mann

Fordi den ikke er importert. Eller en eller annen merkelig syntax-feil som kompilatoren ikke finner ut av.

 

Man kan forresten, som en sidenotis, returnere flere (minst 7) verdier samtidig i Lisp.

Lenke til kommentar
Du kan returnere et array av type String eller int, men for å returnere flere av samme type må de ligge i et array, det er derimot ikke mulig å returnere to instanser av forskjellig type.

 

Tja, du kan jo løse dette ved å returnere en array av typen Object... Ikke den aller peneste måten, men fungerer jo, så :)

Største drawback er jo at du må huske å dokumentere godt rekkefølgen på det du sender med, men...

Lenke til kommentar
Er det mulig å returnere flere verdier fra samme metode? f.eks to Stringer eller to int-verdier?
Du vil kanskje vurdere å lage en egen klasse som disse forskjellige verdiene skal representere. Vanskelig å si når man ikke har mer info enn det du har skrevet der.
Lenke til kommentar
Hvis han trenger å returnere de samme verdiene fra mange metoder, så kan det nok lønne seg med en egen klasse, men hvis han bare skal bruke det i ny og ne er det vel greiere med en array av objekter...
Kommer selvsagt helt an på bruken. Man kan alltids ha et Object[], men ikke dersom man skal bruke det til noe seriøst. Jeg skulle likt å se kontrakten/interfacet/API-en til den datastrukturen som hadde en metode som returnerte, tja, et tall eller kanskje en boolsk variabel av og til?

 

Da må man revurdere Java. Men igjen, det kommer helt an på situasjonen. Selv hadde jeg i Java aldri returnert et Object[], men i Lisp eller Python ville nok den fremgangsmetoden vært utmerket.

Lenke til kommentar

Gitt at du skal spørre om- og hente fire String variabler fra en input, kan du ikke bare spørre klassen som håndterer brukerinteraksjon fire ganger, der hver og en har forskjellige spørsmål til bruker og returnerer gitt svar?

 

Eks:

 

variabel a,b,c,d

spørsmål w,x,y,z

 

a = få svar fra bruker om spørsmål w

b = få svar fra bruker om spørsmål x

c = få svar fra bruker om spørsmål y

d = få svar fra bruker om spørsmål z

 

Du står da med fire variabler (a,b,c,d) med svarene du trenger fra bruker og kan behandle disse videre.

 

Denne metoden er nok ikke optimal hvis du bruker en vindusbasert UI, men hvis det er terminalbasert er det vel greit nok?

Lenke til kommentar
Hvis han trenger å returnere de samme verdiene fra mange metoder, så kan det nok lønne seg med en egen klasse, men hvis han bare skal bruke det i ny og ne er det vel greiere med en array av objekter...
Kommer selvsagt helt an på bruken. Man kan alltids ha et Object[], men ikke dersom man skal bruke det til noe seriøst. Jeg skulle likt å se kontrakten/interfacet/API-en til den datastrukturen som hadde en metode som returnerte, tja, et tall eller kanskje en boolsk variabel av og til?

 

Tenk at du skal returnere en varierende mengde verdier (tenk vareinformasjon som ligger i forskjellige registre (for hadde det vært lagret i ett eksisterende objekt kunne man jo bare returnert det)). Skal du ha en klasse som tar høyde for alle muligheter, hvor mange av variablene ikke vil bli brukt hver gang, vil jeg si det er like greit å bruke et Object[]. Du ender opp med like mange tester (enten på om dataene er i bruk, eller instanceof), men minimerer overhead. Og det blir jo faktisk enda bedre om metoden er i meget hyppig bruk...

 

Da må man revurdere Java. Men igjen, det kommer helt an på situasjonen. Selv hadde jeg i Java aldri returnert et Object[], men i Lisp eller Python ville nok den fremgangsmetoden vært utmerket.

Tja, i Python er det jo ikke noe problem, siden du kan returnere så mange variabler som du vil... Kjenner dessverre ikke Lisp..

Lenke til kommentar
Tenk at du skal returnere en varierende mengde verdier (tenk vareinformasjon som ligger i forskjellige registre (for hadde det vært lagret i ett eksisterende objekt kunne man jo bare returnert det)). Skal du ha en klasse som tar høyde for alle muligheter, hvor mange av variablene ikke vil bli brukt hver gang, vil jeg si det er like greit å bruke et Object[]. Du ender opp med like mange tester (enten på om dataene er i bruk, eller instanceof), men minimerer overhead. Og det blir jo faktisk enda bedre om metoden er i meget hyppig bruk...
Jeg vet ikke om jeg kan forestille meg dette tilfellet i praksis, men du har sikkert rett.
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...