Linkitetystä listasta hakeminen

Olen tekemässä ohjelmaa, joka simuloi käytettyjen autojenkauppaa. Ohjelmani käyttää linkitettyä listaa ja tähän mennessä olen saanut toimimaan autontietojen lisäämisen listaan(id,merkki,rek-numero, vuosimalli,ajettu,hinta,lisätietoja). Nyt siis pystyn lisäämään tarvittavat tiedot listaan, sekä tulostamaan ne. Ohjelmalla voi nyt myös tallentaa linkitetynlistan tiedot tiedostoon ja lukemaan tiedoston sisällön takaisin ohjelmaan.

Ainoa ongelmani on se, etten saa linkitetystä listasta haettua tietoja esimerkiksi auton merkin perusteella. Eli jos käyttäjä haluaa tulostaa näytölle ainoastaan tiedot esimerkiksi volvoista, tulisi
ohjelman tulostaa todellakin vain kaikkien volvojen tiedot.

Alla olevalla yritän saada edes totuus arvon siitä onko käyttäjän antama automerkki ylipäätään listalla. Lukuisista muunnoksista huolimatta vastaus on aina true vaikkei autoamerkkiä listalla olisikaan. Eli mikä ihmeessä voi olla pielessä koodissani. Yritän siis saada aikaiseksi tilannetta, jossa käyttäjä antaa autonmerkin ja jos esim. volvoja on listassa tulostetaan ainoastaan niiden tiedot.

[code]
MAIN………………………
/************************************************************
/* TÄHÄN ETSITÄÄN MERKIN PERUSTEELLA */
//* ei toimi ei!
//************************************************************
//ongelmana on ettei tulostu kuin ensimmäinen solmu tai ei mikään!
String merkki;
boolean onko;
System.out.println("Anna haettava merkki:");
merkki = stdin.readLine(); ///luetaan haettava merkki
omatJupit.onko_nimi(merkki); //katsotaan metodissa onko merkkiä true/false

if(onko=true)
{
   System.out.println("Auto on listassa");
}
else if(onko=false)
{
System.out.println("Auto EI OLE listassa");
}
System.out.println("Autoja ei loytynyt");
omatJupit.tulosta_lista(); // tulostetaan lista ///tulostetaan koko lista
break;
/////////MERKINPERUSTEELLA LOPPUU//////////////////////////
[/code]

Tällä alla olevalla metodilla yritän saada totuusarvon selville!...tuloksetta!
[code]
/*************************************************************************/
//METODI MERKINPERUSTEELLA HAKEMINEN ALKAA onko_nimi
/************************************************************************/
public boolean onko_nimi(String merkki)
{
   SolmuLT ptr = alku; // ptr viittaa listan alkuun
    if ( ptr != null )
    {
   while ( ptr!= null )
       {
       if ( ptr.anna_nimi().equals(merkki))
    {
return true;

} // if while-silmukan sisällä

if(!ptr.anna_nimi().equals(merkki))
{
   return false;
}
ptr = ptr.seuraava();
} // while
       return false;
    }
   
    else
{
System.out.println ("Autolista on tyhjä!");
return false;
}
   
}
///MERKINPERUSTEELLA METODI LOPPUUU!//
[/code]

Tässä on sitten varsinainen tulostusmetodi

[code]
public void tulosta()
{
System.out.println("id valmistaja rekisterinumero vuosimalli ajettu/km hinta lisatietoja");
System.out.println
(tilinumero " " rek " " nimi " " saldo " " km " " maksaa " " tieto);
} // tulosta
[/code]
10449
Äänestä

Muut lukivat myös

Vastaukset 10

Vanhimmat

parametri = arvo;
on sijoitusoperaatio

parametri == arvo;
on vertailuoperaatio

if(onko=true)
pitäisi olla
if(onko == true)
tai pelkästään
if(onko)

Muuten sinä sijoitat aina ennen vertailua onko:n arvoksi true:n.

Toinen ongelma; mihin talletat tämän metodin palauttaman arvon?
omatJupit.onko_nimi(merkki);

Koitahan tämmöistä
onko = omatJupit.onko_nimi(merkki);
ja vielä varmistukseksi vaikka
System.out.println(onko);
niin näet mitä sinun onko_nimi metodi palauttaa arvonaan...

Äänestä
  • No, taitaa olla jokin pielessä itse tuossa nimenperusteella haku metodissa, kun palauttaa falsen kokoajan. Ei ilmeisesti edes tarkasta onko listassa kyseisen merkin autoja.

    Olen yrittänyt ratkaista ongelmaa jo pitkään mutta mikään ei tunnu toimivan :(

    Äänestä

  • ronkale kirjoitti:

    No, taitaa olla jokin pielessä itse tuossa nimenperusteella haku metodissa, kun palauttaa falsen kokoajan. Ei ilmeisesti edes tarkasta onko listassa kyseisen merkin autoja.

    Olen yrittänyt ratkaista ongelmaa jo pitkään mutta mikään ei tunnu toimivan :(

    Edellämainittujen lisäksi vikaa on siinä että annetun automerkin tulisi olla listan ensimmäinen.

    Poista jälkimmäinen if

    if ( ptr.anna_nimi().equals(merkki))
    {
    return true;
    } // if while-silmukan sisällä
    if(!ptr.anna_nimi().equals(merkki))
    {
    return false;
    }

    Äänestä

  • juu kirjoitti:

    Edellämainittujen lisäksi vikaa on siinä että annetun automerkin tulisi olla listan ensimmäinen.

    Poista jälkimmäinen if

    if ( ptr.anna_nimi().equals(merkki))
    {
    return true;
    } // if while-silmukan sisällä
    if(!ptr.anna_nimi().equals(merkki))
    {
    return false;
    }

    Onko sillä merkitystä että jokaisen auton tiedot ovat listassa: id, reknro,merkki,ajettu, hinta.

    Eli täytyy(hän) ensin käydä kokolista läpi id:n perusteella ja sitten alettava tutkimaan id:hen liittyviä atribuutteja?

    Äänestä

  • ronkale kirjoitti:

    Onko sillä merkitystä että jokaisen auton tiedot ovat listassa: id, reknro,merkki,ajettu, hinta.

    Eli täytyy(hän) ensin käydä kokolista läpi id:n perusteella ja sitten alettava tutkimaan id:hen liittyviä atribuutteja?

    Vaikuttaa siltä että sinulla on C-kielen tausta. Kommentoin muutamaa kohtaa.

    Esittämässäsi ohjelmassa id:tä ei käytetä. Mahdollisia käyttökohteita voisi olla auton tunnistaminen poiston tai tietojen muutoksen yhteydessä.

    Oletan että sinulla on linkitetty lista tyyliin:
    auto1->auto2->auto3->auto4->...

    Lista läpikäydään osoittimien avulla ja tässä ei käytetä id:tä.

    Mitähän luokan SolmuLT määritys pitää sisällään?

    Ehdotan että jos harjoituksessasi ei ole erityisesti määrätty käyttämään linkitettyä listaa niin käytät Java:n omia listoja:

    List lista=new ArrayList();

    Ja lisäät siihen olioita tyyliin:

    Luokka olio1=new Luokka();
    olio1.asetaArvo1(...);
    olio1.asetaArvo2(...);
    olio1.asetaArvo3(...);
    olio1.asetaArvo4(...);

    lista.add(olio1);

    Luokka olio2=new Luokka();
    olio2.asetaArvo1(...);
    olio2.asetaArvo2(...);
    olio2.asetaArvo3(...);
    olio2.asetaArvo4(...);

    lista.add(olio2);

    Äänestä

  • juu kirjoitti:

    Vaikuttaa siltä että sinulla on C-kielen tausta. Kommentoin muutamaa kohtaa.

    Esittämässäsi ohjelmassa id:tä ei käytetä. Mahdollisia käyttökohteita voisi olla auton tunnistaminen poiston tai tietojen muutoksen yhteydessä.

    Oletan että sinulla on linkitetty lista tyyliin:
    auto1->auto2->auto3->auto4->...

    Lista läpikäydään osoittimien avulla ja tässä ei käytetä id:tä.

    Mitähän luokan SolmuLT määritys pitää sisällään?

    Ehdotan että jos harjoituksessasi ei ole erityisesti määrätty käyttämään linkitettyä listaa niin käytät Java:n omia listoja:

    List lista=new ArrayList();

    Ja lisäät siihen olioita tyyliin:

    Luokka olio1=new Luokka();
    olio1.asetaArvo1(...);
    olio1.asetaArvo2(...);
    olio1.asetaArvo3(...);
    olio1.asetaArvo4(...);

    lista.add(olio1);

    Luokka olio2=new Luokka();
    olio2.asetaArvo1(...);
    olio2.asetaArvo2(...);
    olio2.asetaArvo3(...);
    olio2.asetaArvo4(...);

    lista.add(olio2);

    käyttää jotain linkitettyä listaa Javassa, kun kaikki rakenteet ja metodit löytyy valmiina.

    ArrayLististä löytyy vielä valmiita käteviä metodeja, joilla voi tarkistaa, että löytyykö se volvo sieltä jo.

    ArrayList.contains()
    ArrayList.indexOf()
    ArrayList.lastIndexOf()

    Jos ArrayList ei riitä, niin sitten HashTable tai Vector

    Äänestä

  • Piru kirjoitti:

    käyttää jotain linkitettyä listaa Javassa, kun kaikki rakenteet ja metodit löytyy valmiina.

    ArrayLististä löytyy vielä valmiita käteviä metodeja, joilla voi tarkistaa, että löytyykö se volvo sieltä jo.

    ArrayList.contains()
    ArrayList.indexOf()
    ArrayList.lastIndexOf()

    Jos ArrayList ei riitä, niin sitten HashTable tai Vector

    Juu, kyllä c taustaa löytyy vuosien takaa. Niin tämä
    on kyllä harjoitustehtävä, mutta en ole saanut tuota
    hakua toimimaan. Kaikki muu kyllä luonnistuu, talletus,muuttaminen,poistaminen, tiedostoon kirjoitus jne.. No alan taas yrittämään ja jos en onnistu pistän tänne solmuLT sisällön, jos sen perusteella voisi hieman auttaa.

    Äänestä

  • ronkale kirjoitti:

    Juu, kyllä c taustaa löytyy vuosien takaa. Niin tämä
    on kyllä harjoitustehtävä, mutta en ole saanut tuota
    hakua toimimaan. Kaikki muu kyllä luonnistuu, talletus,muuttaminen,poistaminen, tiedostoon kirjoitus jne.. No alan taas yrittämään ja jos en onnistu pistän tänne solmuLT sisällön, jos sen perusteella voisi hieman auttaa.

    Tarkasta toimiiko metodi anna_nimi() oikein.

    Äänestä

  • juu kirjoitti:

    Tarkasta toimiiko metodi anna_nimi() oikein.

    No ihan ensimmäinen versioni, jota en edes täällä esittänyt oli täysin toimiva.
    hain vain merkkiä väärästä paikasta(metodista).

    Nyt saan haettua auton merkin ja hinnan perusteella,
    onnistuneesti. Ainoa mikä vielä on väärin on se, että vaikka listassa olisi 2 autoa joilla on ajettu 5000 km niin ainoastaan toinen tulostuu. Taitaa tarvia jonkilaisen lisä luupin vielä??


    Main
    [code]
    double ajettu=0.0;
    System.out.print("\nAutolla on ajettu(km): ");
    ajettu = lue_double();
    loytyi = omatJupit.onko_ajettu( ajettu ); ///tarkastetaan, että kriteerien mukainen auto on listalla

    /******************************************************/
    //Tulostetaan ainostaan autot, joilla ajettu annettu määrä kilometrejä
    /******************************************************/
          
          
    SolmuLT pointerMAX; // osoitin löydetylle solmulle
    pointerMAX = omatJupit.hae_ajettu( ajettu );
       

    //// TULOSTUS LUUPPI TÄHÄN????
          if ( pointerMAX != null )
          {
    ///tulostetaan auton tiedot pointerMAX.tulosta();
          }
          
    ///*****************************************************

    [/code]

    Metodi onko_ajettu
    [code]
    /********************************************************************/
    //Metodi onko_ajettu etsii alkiota solmulistasta. Se palauttaa totuusarvon
    // löytymisestä mainiin! /*******************************************************************/
    public boolean onko_ajettu(double etsittava)
    {
    SolmuLT ptr = alku; // ptr viittaa listan alkuun

    // Jos lista ei ole tyhjä,
    if ( ptr != null )
    {
    // haetaan silmukan avulla.
    while ( ptr!= null )
    {
    if ( ptr.anna_km() == etsittava)
    {
    return true;
    } // if while-silmukan sisällä
    ptr = ptr.seuraava();
    } // while

    return false;
    } // if
    // Tapaus: lista on tyhjä.
    else
    {
    System.out.println ("Autolista on tyhjä!");
    return false;
    }

    }
    ///metodi onko_ajettu LOPPUU***********************
    [/code]

    Metodi hae_ajettu
    [code]
    /*************************************************************************/
    //METODI hae_ajettu etsii solmua listasta
    //double koska auton matkamittarin lukema ei ole tasaluku!
    /************************************************************************/
    public SolmuLT hae_ajettu(double etsittava)
    {

    SolmuLT ptr = alku; // ptr viittaa listan alkuun
    // Jos lista ei ole tyhjä,
    if ( ptr != null )
    {
    // haetaan silmukan avulla.
    while ( ptr!= null )
    {
    if ( ptr.anna_km() == etsittava)
    {
    // System.out.println("\nEtsittävä tieto löytyi listasta");
    return ptr;

    } // if while-silmukan sisällä
    ptr = ptr.seuraava();

    } // while
    // System.out.println("\nEtsittävää tietoa ei löydy listasta");
    return null;
    } // if
    // Tapaus: lista on tyhjä.
    else
    {
    System.out.println ("Autolista on tyhjä!");
    return null;
    }
    }

    ///hae_ajettu LOPPUU
    [/code]

    Äänestä

  • ronkale kirjoitti:

    No ihan ensimmäinen versioni, jota en edes täällä esittänyt oli täysin toimiva.
    hain vain merkkiä väärästä paikasta(metodista).

    Nyt saan haettua auton merkin ja hinnan perusteella,
    onnistuneesti. Ainoa mikä vielä on väärin on se, että vaikka listassa olisi 2 autoa joilla on ajettu 5000 km niin ainoastaan toinen tulostuu. Taitaa tarvia jonkilaisen lisä luupin vielä??


    Main
    [code]
    double ajettu=0.0;
    System.out.print("\nAutolla on ajettu(km): ");
    ajettu = lue_double();
    loytyi = omatJupit.onko_ajettu( ajettu ); ///tarkastetaan, että kriteerien mukainen auto on listalla

    /******************************************************/
    //Tulostetaan ainostaan autot, joilla ajettu annettu määrä kilometrejä
    /******************************************************/
          
          
    SolmuLT pointerMAX; // osoitin löydetylle solmulle
    pointerMAX = omatJupit.hae_ajettu( ajettu );
       

    //// TULOSTUS LUUPPI TÄHÄN????
          if ( pointerMAX != null )
          {
    ///tulostetaan auton tiedot pointerMAX.tulosta();
          }
          
    ///*****************************************************

    [/code]

    Metodi onko_ajettu
    [code]
    /********************************************************************/
    //Metodi onko_ajettu etsii alkiota solmulistasta. Se palauttaa totuusarvon
    // löytymisestä mainiin! /*******************************************************************/
    public boolean onko_ajettu(double etsittava)
    {
    SolmuLT ptr = alku; // ptr viittaa listan alkuun

    // Jos lista ei ole tyhjä,
    if ( ptr != null )
    {
    // haetaan silmukan avulla.
    while ( ptr!= null )
    {
    if ( ptr.anna_km() == etsittava)
    {
    return true;
    } // if while-silmukan sisällä
    ptr = ptr.seuraava();
    } // while

    return false;
    } // if
    // Tapaus: lista on tyhjä.
    else
    {
    System.out.println ("Autolista on tyhjä!");
    return false;
    }

    }
    ///metodi onko_ajettu LOPPUU***********************
    [/code]

    Metodi hae_ajettu
    [code]
    /*************************************************************************/
    //METODI hae_ajettu etsii solmua listasta
    //double koska auton matkamittarin lukema ei ole tasaluku!
    /************************************************************************/
    public SolmuLT hae_ajettu(double etsittava)
    {

    SolmuLT ptr = alku; // ptr viittaa listan alkuun
    // Jos lista ei ole tyhjä,
    if ( ptr != null )
    {
    // haetaan silmukan avulla.
    while ( ptr!= null )
    {
    if ( ptr.anna_km() == etsittava)
    {
    // System.out.println("\nEtsittävä tieto löytyi listasta");
    return ptr;

    } // if while-silmukan sisällä
    ptr = ptr.seuraava();

    } // while
    // System.out.println("\nEtsittävää tietoa ei löydy listasta");
    return null;
    } // if
    // Tapaus: lista on tyhjä.
    else
    {
    System.out.println ("Autolista on tyhjä!");
    return null;
    }
    }

    ///hae_ajettu LOPPUU
    [/code]

    Java:n omilla listoilla tuo olisi helppo mutta pointterikikkailu lisää rutkasti haastetta. Eli vaikeasti teet.

    Jos tuloslista tulee metodista niin paluuarvona tulee olla yhden, usean tai ei yhdenkään auton tiedot. Nyt palautuu max yhden auton tiedot.

    Äänestä

Kommentoi aloitusta


Ronkale kirjoitti:

Olen tekemässä ohjelmaa, joka simuloi käytettyjen autojenkauppaa. Ohjelmani käyttää linkitettyä listaa ja tähän mennessä olen saanut toimimaan autontietojen lisäämisen listaan(id,merkki,rek-numero, vuosimalli,ajettu,hinta,lisätietoja). Nyt siis pystyn lisäämään tarvittavat tiedot listaan, sekä tulostamaan ne. Ohjelmalla voi nyt myös tallentaa linkitetynlistan tiedot tiedostoon ja lukemaan tiedoston sisällön takaisin ohjelmaan.

Ainoa ongelmani on se, etten saa linkitetystä listasta haettua tietoja esimerkiksi auton merkin perusteella. Eli jos käyttäjä haluaa tulostaa näytölle ainoastaan tiedot esimerkiksi volvoista, tulisi
ohjelman tulostaa todellakin vain kaikkien volvojen tiedot.

Alla olevalla yritän saada edes totuus arvon siitä onko käyttäjän antama automerkki ylipäätään listalla. Lukuisista muunnoksista huolimatta vastaus on aina true vaikkei autoamerkkiä listalla olisikaan. Eli mikä ihmeessä voi olla pielessä koodissani. Yritän siis saada aikaiseksi tilannetta, jossa käyttäjä antaa autonmerkin ja jos esim. volvoja on listassa tulostetaan ainoastaan niiden tiedot.

[code]
MAIN………………………
/************************************************************
/* TÄHÄN ETSITÄÄN MERKIN PERUSTEELLA */
//* ei toimi ei!
//************************************************************
//ongelmana on ettei tulostu kuin ensimmäinen solmu tai ei mikään!
String merkki;
boolean onko;
System.out.println("Anna haettava merkki:");
merkki = stdin.readLine(); ///luetaan haettava merkki
omatJupit.onko_nimi(merkki); //katsotaan metodissa onko merkkiä true/false

if(onko=true)
{
   System.out.println("Auto on listassa");
}
else if(onko=false)
{
System.out.println("Auto EI OLE listassa");
}
System.out.println("Autoja ei loytynyt");
omatJupit.tulosta_lista(); // tulostetaan lista ///tulostetaan koko lista
break;
/////////MERKINPERUSTEELLA LOPPUU//////////////////////////
[/code]

Tällä alla olevalla metodilla yritän saada totuusarvon selville!...tuloksetta!
[code]
/*************************************************************************/
//METODI MERKINPERUSTEELLA HAKEMINEN ALKAA onko_nimi
/************************************************************************/
public boolean onko_nimi(String merkki)
{
   SolmuLT ptr = alku; // ptr viittaa listan alkuun
    if ( ptr != null )
    {
   while ( ptr!= null )
       {
       if ( ptr.anna_nimi().equals(merkki))
    {
return true;

} // if while-silmukan sisällä

if(!ptr.anna_nimi().equals(merkki))
{
   return false;
}
ptr = ptr.seuraava();
} // while
       return false;
    }
   
    else
{
System.out.println ("Autolista on tyhjä!");
return false;
}
   
}
///MERKINPERUSTEELLA METODI LOPPUUU!//
[/code]

Tässä on sitten varsinainen tulostusmetodi

[code]
public void tulosta()
{
System.out.println("id valmistaja rekisterinumero vuosimalli ajettu/km hinta lisatietoja");
System.out.println
(tilinumero " " rek " " nimi " " saldo " " km " " maksaa " " tieto);
} // tulosta
[/code]

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu