Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Vaikeuksia silmukoiden kanssa

somefckr [03.03.2018 21:08:35]

#

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?

Metabolix [03.03.2018 21:41:26]

#

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(...);
}

somefckr [03.03.2018 21:56:44]

#

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

Grez [03.03.2018 23:33:28]

#

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/breaking-out-of-nested-loops-in-java

somefckr [04.03.2018 15:42:04]

#

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: ");

	}
}

Grez [04.03.2018 15:56:35]

#

Käyt listan läpi (esim. foreach -loopissa) ja jos alkion vuosiluku on oikea, tulostat sen.

somefckr [04.03.2018 18:21:07]

#

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.

Vastaus

Aihe on lukittu, joten siihen ei voi vastata.

Tietoa sivustosta