12 svar
148 visningar
Solenskiner är nöjd med hjälpen
Solenskiner 87
Postad: 12 feb 2022 13:30 Redigerad: 13 feb 2022 02:39

Scanner classen…..

Hej! Jag skapar ett enkelt program som ska hjälpa mig bestämma vad för mat jag ska äta om jag ej är säker. När jag skriver i min Consol ett nyckelord såsom kött så kan jag ej lämna consolen… när jag skriver något och sedan trycker enter så förväntar consolen sig en input, trotts att den har fått det. Om jag sedan trycker enter flera gånger förväntar sig consolen fortfarande en input….  När jag istället skriver ett ord som inte finns i min foodlist såsom hej så måsta jag trycka enter två gånger för att lämna consolen… jag vet att Scanner classen fungerar lite konstigt ibland men skulle någon snälla kunna säga vad jag måste göra för att lämna consolen direkt då jag har skrivit in min input ? Vad är det för fel på mitt program ? Tack för att du läste!!!

 

import java.util.ArrayList;import java.util.Scanner;
import java.lang.System;

public class Foodlist {

public static void main(String[] args) {

boolean program = true;

ArrayList<String> foodlist = new ArrayList<>();
System.out.println("");
System.out.println("Welcome to the foodlist. This list helps you decide what you are going to eat.\n");

System.out.println("Type a keyword if you have a clue of what you want to eat\n");

Scanner obj = new Scanner(System.in);

foodlist.add("spagetti & köttfärs");
foodlist.add("ris & kyckling");
foodlist.add("lasagne");
foodlist.add("köttbullar & makaroner");
foodlist.add("fisk, potatis & vitsås");
foodlist.add("broccolisoppa");
foodlist.add("dolma");

String key =obj.nextLine().toLowerCase().trim();
if(obj.nextLine().toLowerCase().trim().contains(key)) {
System.out.println("Here is a list that contains the word " + key);
for( int i = 0; i < foodlist.size(); i++) {
if(foodlist.get(i).contains(key)) {
System.out.println("\n");
System.out.println(foodlist.get(i));
System.out.println("\n");
}
}

}
int a = 0;
while( a < 7 ) {
if(foodlist.get(0).contains(key) == false) {
System.out.println("\n");
System.out.println(foodlist.get(a));
System.out.println("\n");
a++;
}

}

}

}

SeriousCephalopod 2692
Postad: 12 feb 2022 13:37

Du kan kopiera in formatterad text av koden istället. Då kan folk copy-pastea in det i sina editors och felsöka om de vill.

Solenskiner 87
Postad: 12 feb 2022 13:41 Redigerad: 12 feb 2022 14:23
import java.util.ArrayList;import java.util.Scanner;
import java.lang.System;

public class Foodlist {
   
    public static void main(String[] args) {

      boolean program = true;

        ArrayList<String> foodlist = new ArrayList<>();
        System.out.println("");
        System.out.println("Welcome to the foodlist. This list helps you decide what you are going to eat.\n");
       
        System.out.println("Type a keyword if you have a clue of what you want to eat\n");
       
        Scanner obj = new Scanner(System.in);
   
        foodlist.add("spagetti & köttfärs");
        foodlist.add("ris & kyckling");
        foodlist.add("lasagne");
        foodlist.add("köttbullar & makaroner");
        foodlist.add("fisk, potatis & vitsås");
        foodlist.add("broccolisoppa");
        foodlist.add("dolma");
       
    String key =obj.nextLine().toLowerCase().trim();
    if(obj.nextLine().toLowerCase().trim().contains(key)) {
      System.out.println("Here is a list that contains the word " + key);
            for( int i = 0; i < foodlist.size(); i++) {
              if(foodlist.get(i).contains(key)) {
              System.out.println("\n");
              System.out.println(foodlist.get(i));
              System.out.println("\n");  
        }      
  }

}
    int a = 0;
    while( a < 7 ) {
       if(foodlist.get(0).contains(key) == false) {
          System.out.println("\n");
          System.out.println(foodlist.get(a));
          System.out.println("\n");
              a++;
          }
         
        }

    }
       
 }
SeriousCephalopod 2692
Postad: 12 feb 2022 13:55 Redigerad: 12 feb 2022 14:02

Tänker inte felsöka  koden helt men dubbleringsfelet måste väl komma av raderna

String key =obj.nextLine().toLowerCase().trim();
if(obj.nextLine().toLowerCase().trim().contains(key)) {

Först läser du en rad från input och registrerar det som key.

Därefter läser du scannern igen(???) och kollar om användarens nya text innehåller det man skrev förra gången.

Solenskiner 87
Postad: 12 feb 2022 14:20 Redigerad: 12 feb 2022 15:05

 

SeriousCephalopod 2692
Postad: 12 feb 2022 14:34

Att felsöka en ostoppbarloop är det enklaste man kan göra. 

Man kontrollerar vad break-villkoret för loopen är.

I ditt fall är det

while(b < 7 )

Enda platsen då värdet på b ökas är i b = 7..,

Men det ligger innanför if-satsen så tar man sig aldrig in i ifsatsen så ändras aldrig värdet på b och då kan man aldrig ta sig ur loopen.

Din kod skulle må bra av att brytas ned i delfunktioner. Främst för att du skulle ha lättare att felsöka om output-kod , input-kod, och villkors-kod inte blandades. 

Solenskiner 87
Postad: 12 feb 2022 14:52

Det är ju något fel på while ( a < 7 ) { … }
dvs, inuti min else statement men jag mejlservers hjälp med vad för fel jag gör där 

Solenskiner 87
Postad: 12 feb 2022 14:55

Nu fattar jag vad du menar, Tack!!!!!!

Solenskiner 87
Postad: 12 feb 2022 14:55

Jag löste det nu !!!!

SeriousCephalopod 2692
Postad: 12 feb 2022 15:01

Två avslutande kommentarer: 

(1) Dina rader med

System.out.println("\n");

och att avsluta med \n är jättefult. println genererar redan ett radbyte och finns ingen anledning att ha så här många blankrader i programmet. Alla sådana rader ska bort.

(2) Om du skriver samma block av text två gånger i koden så ska det vara i en separat funktion

Koden för att skriva ut food-listan borde vara i en void-funktion och inte upprepas i två block. Om du vill ändra formatteringen av hur saker skrivs ut måste du göra det på två platser.

public void print_foodlist(String key) {}

och sedan kan en ""-key ge hela listan eller något.

Fermatrix 7841 – Fd. Medlem
Postad: 12 feb 2022 15:07 Redigerad: 12 feb 2022 15:08

Du har också en Boolean som heter program som du aldrig använder. Du glömmer också att använda:

obj.close();



Det är inget större problem i just detta fallet men det är en bra vana.

Solenskiner 87
Postad: 12 feb 2022 15:56

Tack för hjälpen!!!!

Fermatrix 7841 – Fd. Medlem
Postad: 13 feb 2022 02:44

Solenskiner, det är absolut inte tillåtet att redigera bort frågan samt dina tidigare svar efter tråden besvarats. Skärpning!

Jag har återskapat de flesta inläggen.
/Dracaena, Moderator

Svara Avbryt
Close