Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Reseptihaku tehtävä

mirzu42 [31.12.2019 18:35:37]

#

Elikkäs toivoisin että joku olisi niin kiltti että voisi auttaa tässä probleemissa. olen siis melko uusi vielä ohjelmointiin enkä vielä ymmärrä kaikkea.

Eli ideana on että minulla on käytössä teksti tiedosto jossa on reseptejä.
eka rivi on nimi, toka rivi keittoaika ja loput ainesosia. tyhjästä rivistä alkaa uusi resepti.

minun pitäisi pystyä etsimään ainesosan perusteella reseptejä teksistä. eli jos resepti olisi:
Lihapullat
20
jauheliha
muna
korppujauho

ja etsisin merkkijonolla "muna" niin tuo resepti tulisi esille muodossa (nimi, keittoaika)

tässä koodi:

import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;

public class Reseptihaku {

    public static void main(String[] args) {
        Scanner lukija = new Scanner(System.in);
        ArrayList<Resepti> reseptit = new ArrayList<>();



        System.out.println("Mistä luetaan?");
        String tiedosto = lukija.nextLine();

        try (Scanner tiedostonLukija = new Scanner (new File(tiedosto))) {


            while (tiedostonLukija.hasNextLine()) {
                    String reseptinNimi = tiedostonLukija.nextLine();


            while (tiedostonLukija.hasNextInt()) {
                int valmistusAika = tiedostonLukija.nextInt();
                //luodaan uusi Resepti olio
                Resepti resepti = new Resepti (reseptinNimi, valmistusAika);
                  //lisätään Resepti-olio listaan
                     reseptit.add(resepti);


                while(tiedostonLukija.hasNextLine()){
                    //luetaan raaka-aineita tiedostosta
                    String raakaAine =tiedostonLukija.nextLine();
                    if (raakaAine.isEmpty()) {
                        break;
                    }
                    resepti.lisaaRaakaAine(raakaAine);

                }
            }
            }



        }
        catch (Exception e){
            System.out.println("Virhe: "+ e.getMessage());
        }
          System.out.println("Komennot: ");
        System.out.println("listaa - listaa reseptit");
        System.out.println("lopeta - lopettaa ohjelman");
        System.out.println("hae nimi - hakee reseptiä nimen perusteella");
        System.out.println("hae keittoaika - hakee reseptiä keittoajan perusteella");
        System.out.println("hae aine - hakee reseptiä raaka-aineen perusteella");

            while (true){
                System.out.println("Syötä komento: ");
                String komento = lukija.nextLine();

                if (komento.equals("lopeta")) {
                    break;
                }
                if (komento.equals("listaa")) {
                    for (int i =0; i<reseptit.size();i++) {
                        System.out.println(reseptit.get(i).getNimi() + ", keittoaika: " + reseptit.get(i).getKeittoAika());
                    }
                }
                if (komento.equals("hae nimi")) {
                    System.out.println("Mitä haetaan?");
                    String etsittava =lukija.nextLine();
                    for (int i =0;i<reseptit.size();i++) {
                        if (reseptit.get(i).getNimi().contains(etsittava)) {
                            System.out.println(reseptit.get(i).getNimi() + ", keittoaika: " + reseptit.get(i).getKeittoAika());
                        }
                    }
                }
                if (komento.equals("hae keittoaika")) {
                    System.out.println("Keittoaika korkeintaan: ");
                    int maksimi = Integer.valueOf(lukija.nextLine());

                    for (int i =0;i<reseptit.size();i++){
                        if (reseptit.get(i).getKeittoAika()<=maksimi) {
                        System.out.println(reseptit.get(i).getNimi() + ", keittoaika: " + reseptit.get(i).getKeittoAika());
                        }
                    }
                }
                if (komento.equals("hae aine")){
                    System.out.println("Mitä raaka-ainetta haetaan: ");
                    String haettava = lukija.nextLine();
                    for (int i =0;i<reseptit.size(); i++) {
                        for (int x =0;x<reseptit.get(i).getRaakaAineet().size();x++) {
                            if (reseptit.get(i).getRaakaAineet().get(x).equals(haettava)) {
                                System.out.println("onnistui");
                            }
                        }

                    }
                }
            }


    }

}

ja vielä resepti luokka:

import java.util.*;
public class Resepti {
    private String nimi;
    private ArrayList<String> reseptit;
    private ArrayList<String> raakaAineet;
    private int keittoAika;


    public Resepti (String nimi, int keittoAika) {
        this.raakaAineet = new ArrayList<>();
        this.reseptit=new ArrayList<>();
        this.nimi=nimi;
        this.keittoAika=keittoAika;
    }

    public void lisaaResepti(String nimi){
        this.reseptit.add(nimi);
    }

    public String getNimi(){
        return this.nimi;
    }
    public void lisaaRaakaAine(String raakaAine) {
        this.raakaAineet.add(raakaAine);
    }
    public void lisaaKeittoAika(int aika){
        this.keittoAika=aika;
    }

    public int getKeittoAika(){

        return this.keittoAika;
    }
    public ArrayList<String> getRaakaAineet(){
        return raakaAineet;
    }



}

ilmeisesti ongelma piilee siinä etten lue listasta raakaAineet tietoa oikein tai jotain muuta vastaavaa. koodi toimii muuten täydellisesti paitsi tuo viimeinen komento hae aine

tämä tehtävä on siis mooc ohjelmointi 2019 kurssin osan 7.5 toiseksi viimeinen tehtävä jos tehtävän anto kiinnostaa tarkemmin

vesikuusi [01.01.2020 12:31:39]

#

Lisää tiedostonLukija.nextLine() kutsu ennen raaka-aineiden lukemista eli

int valmistusAika = tiedostonLukija.nextInt();
//luodaan uusi Resepti olio
Resepti resepti = new Resepti (reseptinNimi, valmistusAika);
//lisätään Resepti-olio listaan
reseptit.add(resepti);
tiedostonLukija.nextLine(); // <-- Lisää tämä. luetaan rivinvaihto pois.
while(tiedostonLukija.hasNextLine()) {

Tämä siksi, että Scanner.nextInt() ei lue rivinvaihtoa vaan se on luettava erillisellä kutsulla pois.

mirzu42 [01.01.2020 16:28:27]

#

Kiitoksia! ratkaisu oli siis yllättävän simppeli.

Metabolix [01.01.2020 17:02:32]

#

Tutkipa tätä syötettä:

Porkkanasose
10
porkkanoita
tehosekoitin

6 minuutin muna
10
muna
vettä
kattila

Nykyisellä koodillasi tämä tuottaa kaksi porkkanasosetta, joista jälkimmäinen kestää 6 minuuttia (loput rivistä ohitetaan) ja sisältää aineet 10, muna, vettä, kattila.

Koodissa ei kuuluisi olla while-silmukkaa ajan lukemisessa, vaan reseptin nimen jälkeen pitäisi suoraan lukea aika.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta