Ongelma javan do-while-loopissa, johon tarvitsisin apua.
Koodi(t) alla.
public class main { public static void main(String[] args) { ArrayList<ReturnDate> dates = new ArrayList<ReturnDate>(); Scanner input = new Scanner(System.in); String userDate; String output = ""; do { System.out.print("Enter date: "); userDate = input.nextLine(); dates.add(new ReturnDate(userDate)); } while (!userDate.equals("")); for (int i = 0; i < dates.size(); i++) { output += dates.get(i); } System.out.println(output); } }
Ylläoleva koodi lykkää erroria jos painan entteriä(syötän tyhjän rivin)
Joka johtunee siitä, että Arraylistiin yritetään syöttää tuo rivinvaihto(?)
Joka tässä tapauksessa pitää sisällään päivämääriä.
Noh, jos muutankin koodia näin:
public class main { public static void main(String[] args) { ArrayList<ReturnDate> dates = new ArrayList<ReturnDate>(); Scanner input = new Scanner(System.in); String userDate = input.nextLine(); String output = ""; do { System.out.print("Enter date: "); dates.add(new ReturnDate(userDate)); userDate = input.nextLine(); } while (!userDate.equals("")); for (int i = 0; i < dates.size(); i++) { output += dates.get(i); } System.out.println(output); } }
Tulostaa tämä ensin tyhjän rivin jossa ei lue mitään, vasta syötettyäni tähän tyhjään riviin päivämäärän(tässä tapauksessa), ilmestyy tuo teksti "Enter date:"
Siis koodihan toimii, mutta miksi se tulostaa tuon tyhjän rivin?
Ei se mitään tyhjää riviä tulosta. Kuten näet, oman tekstin syöttö alkaa siitä ensimmäisen rivin alusta, eli yhtään mitään ei ole tulostettu. Ongelma on nextLine-kutsujen väärässä sijoittelussa. Katso koodistasi, missä kohti lukee ensimmäisen kerran nextLine, niin ehkä asia valkenee.
Koodisi logiikka on pielessä. Aluksi luet yhden rivin. Sitten alkaa silmukka. Silmukassa tulostat pyynnön, luot aiemmin luetusta rivistä päivämäärän listaan ja viimeiseksi luet uuden rivin. Tosin sanoen listaan lisääminen on aina yhden rivin jäljessä.
Oikea logiikka menisi näin: Aloita silmukka. Tulosta pyyntö. Lue rivi. Jos rivi on tyhjä, keskeytä silmukka (break). Muuten lisää rivi listaan ja jatka silmukkaa.
while (true) { print(...); line = input.nextLine(); if ("".equals(line)) { break; } dates.add(...); }
Kiitos!
Tämä selvensi asiaa.
Lisäys:
Lisää kysymyksiä. Miksi alla oleva koodi tulostaa 2 "Enter desired action: " -stringiä, kun olen syöttänyt case 1, olevat kohdat?
Tämäkin ongelma on sellainen mitä olen yrittänyt ratkaista, ennen kysymyksen esittämistä tänne.
tyyliin:
Enter song name: Not fakin' it
Enter artist: Michael Monroe
Enter song lenght in minutes: 3
Enter song lenght in seconds: 52
Not fakin' it by Michael Monroe added!
Enter desired action:
Enter desired action:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String userSelection, track, artist; int deleteTrack, minutes, seconds; Playlist playlist = new Playlist(); System.out.println("[1] Add Song"); System.out.println("[2] Delete Song"); System.out.println("[3] Shuffle"); System.out.println("[4] Show Playlist"); System.out.println("[5] Exit"); while (true) { System.out.print("\nEnter desired action: "); userSelection = scanner.nextLine(); switch (userSelection) { case "1": System.out.println(); System.out.print("Enter song name: "); track = scanner.nextLine(); System.out.print("Enter artist: "); artist = scanner.nextLine(); System.out.print("Enter song lenght in minutes: "); minutes = scanner.nextInt(); System.out.print("Enter song lenght in seconds: "); seconds = scanner.nextInt(); Songs song = new Songs(track, artist, minutes, seconds); playlist.addToList(song); System.out.println(track + " " + "by " + artist + " added!"); break; case "2": //do something
somefckr kirjoitti:
Lisää kysymyksiä. Miksi alla oleva koodi tulostaa 2 "Enter desired action: " -stringiä, kun olen syöttänyt case 1, olevat kohdat?
No vaikea nyt sanoa näkemättä mitä tuon case "2" jälkeen on koodia, mutta lähtökohtaisesti tuo case "1" -lopussa oleva "break;" koskee tuota case "1" -ehtoa. Eli siitä poistumisenkin jälkeen koodi on yhä "while (true)" loopissa.
Tuolla käydään aika hyvin läpi noita vaihtoehtoja useamman rakenteen sisältä poistumiseen kerralla:
https://stackoverflow.com/questions/886955/
Ok. Kiitos.
Lisää kysymyksiä. Miten tuo contains -metodi pitäisi rakentaa alla olevassa koodissa?
Tarkoituksena kysyä käyttäjältä vuosiluku ja tulostaa ArrayLististä kaikki kyseisen vuoden päivämäärät.
import java.util.ArrayList; import java.util.Scanner; import date.ReturnDate; public class main { public static void main(String[] args) { ArrayList<ReturnDate> dates = new ArrayList<ReturnDate>(); Scanner input = new Scanner(System.in); dates.add(new ReturnDate("27.1.2018")); dates.add(new ReturnDate("13.8.2010")); dates.add(new ReturnDate("5.5.2011")); String userDate; String output = ""; String userYear; while (true) { System.out.print("Enter date: "); userDate = input.nextLine(); if ("".equals(userDate)) { for (int i = 0; i < dates.size(); i++) { output += dates.get(i); } System.out.println(output); break; } dates.add(new ReturnDate(userDate)); } System.out.print("Enter year: "); userYear = input.nextLine(); if (dates.contains(userDate)) { System.out.println("wohoo"); } else { System.out.println("not found!"); } System.out.print("Enter date: "); } }
Käyt listan läpi (esim. foreach -loopissa) ja jos alkion vuosiluku on oikea, tulostat sen.
Grez kirjoitti:
Käyt listan läpi (esim. foreach -loopissa) ja jos alkion vuosiluku on oikea, tulostat sen.
No tällähän se meni. Kiitos jälleen kerran.
Aihe on lukittu, joten siihen ei voi vastata.