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
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.
Kiitoksia! ratkaisu oli siis yllättävän simppeli.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.