webForumDet fria alternativet

två frågor om fält...

11 svar · 378 visningar · startad av mikael_a

mikael_aMedlem sedan mars 2000475 inlägg
#1

Jag försöker att lära mig hur fält fungerar...

Jag lagrar ett x antal uppgifter i ett fält. t.ex. förnamn, efternam och adress...

jag har försökt att göra en sök funktion, men jag får inte det att fungera, och hur skriver jag sedan ut bara personen den har hittat?

variablar: sökt = string,
hittad = boolean

record är namnet på fältet...


else if (huvudMenyVal == 3)
{

System.out.print("\n	Ange får- och efternamn p† den person du vill såka p†: ");
sökt = SavitchIn.readLine();

   for (int i = 0; i < sökt.length; i++)
   if (record[i] == sökt)
   hittad = true;

if (hittad)
{
System.out.println("\n	Personen funnen");
System.out.println(" ");
}

else
{
System.out.println("\n	Tyv„rr personen finns ej i registret");
System.out.println(" ");
}

så här sparar jag till fältet


if (huvudMenyVal == 1)
				{
				record = new PersonRegister[antalPersoner];
    	    	for (int i = 0; i < antalPersoner; i++)

			{
            record[i] = new PersonRegister();
            System.out.println("\n	Skriv in data får person nummer " + (i + 1));
            record[i].readInput();
            System.out.println();
        		}
			}

och till fråga 2

hur raderar jag sedan t.ex. post nummer 2? antar att jag har 10 namn inskrivna och vill radera namn nr 2 ifrån fältet...

tacksam för all hjälp... är i nybörjar stadiet, och börjar fatta lite :)

PeWMedlem sedan juni 200010 432 inlägg
#2

Om du ska jämföra strängar måste du endera använda dig av de metoder som finns i standardklassen string... t.ex s1.equal(s2) eller göra en egen metod för det.

sökt = SavitchIn.readLine();

   for (int i = 0; i < sökt.length; i++)
   if (sökt.equals(record[i] ))
      hittad = true;

Sen är det nog bättre att skippa flaggan "hittad" och istället helt enkelt returnera / tilldela en referens till det hittade objektet. Om du t.ex vill kunna få träff på fler objekt kan man ju då ist peta in referenser för varje träff i en lista... och sen kolla om listan innehåller något eller inte.

   for (int i = 0; i < sökt.length; i++)
   if (sökt.equals(record[i] ))
      obj_ref = record[i];

Är det fler som ska sparas:

 int j = 0;
   for (int i = 0; i < sökt.length; i++)
   if (sökt.equals(record[i] )){
      obj_ref[j] = record[i];
     j++;
     }

Fast jag skulle hellre använda list() eller vector() än statiska arrayer. ;)

mikael_aMedlem sedan mars 2000475 inlägg
#3

hmmm om jag använder ditt första exempel, så får jag följande fel:

Java 75: cannot resolve symbol
symbol : variable lenght
location : class.java.String
for (int i = 0; i < sökt.length; i++)
z (en pil pekar på punkten)

ViktorMedlem sedan aug. 20021 752 inlägg
#4

length är en funktion altså måste du skriva length()
Som det är skrivet nu så försöker du anroppa en variabel i klassen String.

/Viktor

mikael_aMedlem sedan mars 2000475 inlägg
#5

ok, programmet startar, men det blir ett java.lang.arrayIndexOutOfBoundsException fel på raden

ViktorMedlem sedan aug. 20021 752 inlägg
#6

Ska inte

sökt = SavitchIn.readLine();

   for (int i = 0; i < sökt.length(); i++)
   if (sökt.equals(record[i] ))
      hittad = true;

vara

sökt = SavitchIn.readLine();

   for (int i = 0; i < [B]record[/B].length(); i++)
   if (sökt.equals(record[i] ))
      hittad = true;

??
Lite osäker på hur man får fram storleken på en array så record.length() kanske är fel men det som den ska ta fram är altså storleken på arrayen.
Som det är nu så loopar den så många gånger som det finns tecken i strängen som användaren har skrivit in.

/Viktor

ViktorMedlem sedan aug. 20021 752 inlägg
#7

En ska till,

   if (sökt.equals(record[i] ))
      hittad = true;

borde inte det vara

   if (sökt.equals(record[i][B].getName()[/B]))
      hittad = true;

?
Du ska väll gämföra namnet, inte hela objektet.
Du får byta "getName()" mot vad din funktion för att hämta ut namnet från kalssen heter.

/Viktor

mikael_aMedlem sedan mars 2000475 inlägg
#8

det fungerade inte heller...

det jag vill göra är att söka efter ett namn som finns lagrat i ett fält som heter record.... namnet du söker på sparas i en string "sökt" så om du skriver "kalle svensson" så sparas detta i sökt och så vill jag leta igenom fältet record om det finns så skall det skrivas ut, annars skrivs det ut att det inte finns...

bifogar koden...

*** PersonData.java ***


public class PersonData
{
    private PersonRegister[] record;
    private int antalPersoner, huvudMenyVal;
    private String sökt;
    boolean huvudMeny = true;

  	boolean hittad = false;

    public void getUppgifter()
    {
        System.out.println("	Välkommen till Personregistreraren 2002 version 3.0\n");
        System.out.println("	");
        System.out.print("	Hur m†nga personer vill du kunna spara? ");
        antalPersoner = SavitchIn.readLineInt();

			while (huvudMeny == true)
			{
			System.out.println("");
			System.out.println("	ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»");
			System.out.println("	º                                   º");
			System.out.println("	º - Personregistreraren version 3 - º");
			System.out.println("	º                                   º");
			System.out.println("	º              Huvud Meny           º");
			System.out.println("	º                                   º");
			System.out.println("	º      1. Mata in person            º");
			System.out.println("	º      2. Visa personlista          º");
			System.out.println("	º      3. Såk p† person             º");
			System.out.println("	º      4. Ta bort person            º");
			System.out.println("	º      5. Avsluta programmet        º");
			System.out.println("	º                                   º");
			System.out.println("	ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ");
			System.out.println("");
			System.out.print("	Ange val: ");
			huvudMenyVal = SavitchIn.readLineInt();

			if (huvudMenyVal == 1)
				{
				record = new PersonRegister[antalPersoner];
    	    	for (int i = 0; i < antalPersoner; i++)

			{
            record[i] = new PersonRegister();
            System.out.println("\n	Skriv in data får person nummer " + (i + 1));
            record[i].readInput();
            System.out.println();
        		}
			}

			else if (huvudMenyVal == 2)
			{
		      System.out.println(" ");
		      for (int i = 0; i < antalPersoner; i++)
		      record[i].writeOutput();
              System.out.println();

			}

			else if (huvudMenyVal == 3)
			{

			System.out.print("\n	Ange får- och efternamn p† den person du vill såka p†: ");
			sökt = SavitchIn.readLine();

			for (int i = 0; i < record.length(); i++)
			if (sökt.equals(record[i].getFörnamn() ))
			             hittad = true;

				if(hittad)
						{
			          System.out.println("\n	Personen funnen");
			          System.out.println(" ");
						}
			    else
			    {
           		System.out.println("\n	Tyv„rr personen finns ej i registret");
           		System.out.println(" ");
				}

//			System.out.print("	Programmet avslutas...");
//			huvudMeny = false;
//			break;
			}

			else if (huvudMenyVal == 4)
			{
			System.out.print("	Programmet avslutas...");
			huvudMeny = false;
			break;
			}

			else if (huvudMenyVal == 5)
			{
			System.out.print("\n	Programmet avslutas...\n\n");
			huvudMeny = false;
			break;
			}

			else
			{
			System.out.print("\n	Valet fanns inte, var god fårsåk igen...\n");
			huvudMeny = true;
			}

			}
	}

public static void main(String[] arg)
{

PersonData clerk = new PersonData();
clerk.getUppgifter();
 //		clerk.displayMeny();
 //   clerk.update();
   //   clerk.displayResults();
	}
}

*** PersonRegister.java ***


public class PersonRegister
{
    private String förnamn, efternamn, födelseår, adress, postnummer, postort;

    public PersonRegister()
    {
      	förnamn = "Ingen Data";
        efternamn = "Ingen Data";
        födelseår = "Ingen Data";
        adress = "Ingen Data";
        postnummer = "Ingen Data";
        postort = "Ingen Data";
    }

    public PersonRegister(String initialFörnamn, String initialEfternamn, String initialFödelseår, String initialAdress, String initialPostnummer, String initialPostort)
    {
        set(initialFörnamn, initialEfternamn, initialFödelseår, initialAdress, initialPostnummer, initialPostort);
    }

    public void set(String newFörnamn, String newEfternamn, String newFödelseår, String newAdress, String newPostnummer, String newPostort)
    {
        förnamn = newFörnamn;
        efternamn = newEfternamn;
        födelseår = newFödelseår;
        adress = newAdress;
        postnummer = newPostnummer;
        postort = newPostort;
    }

    public void readInput()
    {
        System.out.print("\n	Ange fårnamn: ");
        förnamn = SavitchIn.readLine();

        System.out.print("	Ange efternamn: ");
        efternamn = SavitchIn.readLine();

        System.out.print("	Ange fådelse†r: ");
        födelseår = SavitchIn.readLine();

        System.out.print("	Ange adress: ");
        adress = SavitchIn.readLine();

        System.out.print("	Ange postnummer: ");
        postnummer = SavitchIn.readLine();

        System.out.print("	Ange postort: ");
        postort = SavitchIn.readLine();

    }

    public void writeOutput()
    {
        System.out.println("	");
        System.out.println("	Namn: "+förnamn+" "+efternamn);
        System.out.println("	Fådelse†r: "+födelseår);
        System.out.println("	Adress: ");
        System.out.println("	"+adress);
        System.out.println("	"+postnummer+" "+postort);
        System.out.println("	");

    }

    public String getFörnamn()
    {
        return förnamn;
    }

    public String getEfternamn()
    {
        return efternamn;
    }

    public String getFödelseår()
	    {
	        return födelseår;
    }

    public String getAdress()
	    {
	        return adress;
    }

	public String getPostnummer()
    {
        return postnummer;
    }

	public String getPostort()
    {
        return postort;
    }

}

tacksam för all hjälp jag hitills har fått... det här med fält är tycker jag är lite krångligt... :)

PeWMedlem sedan juni 200010 432 inlägg
#9

Det är inte så krångligt. Men det hade förmodligen varit enklare om du byggt upp klassen lite mer OOP-mässigt. Nu liknar programmets uppbyggnad strukturerad programmering med en klass som datasamling (struct). Skitsamma, den biten kommer väl senare för dig, antar jag.

För att lösa ditt problem med indexOutOfBounds:

for (int i = 0; i < record.length()-1; i++)
            if (sökt.equals(record[i].getFörnamn() ))
                         hittad = true;

*lade till -1 *

Mao så måste du ta med i beräkningen att längden på fältet är kanske t.ex 4 men index slutar i det fallet på 3 ;)

Nu kanske det är meningen att du ska köra med ett statiskt fält, men en sån här uppgift är betydligt lättare om du använder vector (i java.util)

mikael_aMedlem sedan mars 2000475 inlägg
#10

tack... men jag får fortfarande ett error...

cannot resolve symbol
symbol : method length ()
location : class PersonRegister[]

for (int i = 0; i < record.length()-1; i++)

( en pil på punkten)

phonkworksMedlem sedan juli 2001228 inlägg
#11

record.length
ska de va.

Regel:
En array vet sin längd
En sträng vet inte sin längd

mvh
phonk

PeWMedlem sedan juni 200010 432 inlägg
#12

Ta bort "()" efter length ... det du gör nu är att anropa en metod som heter length() i class PersonRegister... och nån sådan har du inte implementerat. Alternativt så gör du en klassvariabel i PersonRegister som räknas upp varje gång du skapar ett nytt objekt, alt har du en räknare i "main" som håller reda på alla instanser.

Din register-klass är lite lustig. Den är både ett register och en datatyp för personer. Om jag vore som du skulle jag plocka ut alla inmatningar och utskrifter från klassen och ta bort metoden "set". Istället skulle jag använda den andra konstruktorn för att direkt initiera instansen.

public PersonRegister(String förnamn, String efternamn, String födelseår, String adress, String postnummer, String postort)
    {
        this.förnamn = förnamn;
        this.efternamn = efternamn;
        this.födelseår = födelseår;
        this.adress = adress;
        this.postnummer = postnummer;
        this.postort = postort;

    }

I den första klassen (i detta fall class PersonData) sköter man all kommunikation med användaren, initierar instansen med datan och hämtar för jämförelser och utskrift.

139 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)