2015-10-26 41 views
0

我有一個簡單的搜索方法來比較用戶的輸入字符串與ArrayList中的字符串。當我使用input.nextLine()時,它沒有找到字符串,但是,當我使用input.next()時,它工作。有人可以解釋爲什麼會出現此錯誤嗎爲什麼input.next()適用於搜索ArrayList,但.nextLine()不適用?

searchPlants方法就是發生問題的地方。

駕駛員:

import java.util.ArrayList; 
    import java.util.Iterator; 
    import java.util.Scanner; 

    public class Driver { 

public String ID = new String(); 
public String name = new String(); 
public String color = new String(); 
public String smell = new String(); 
public String hasThorns = new String(); 
public String isPoisonous = new String(); 
public String isMedicine = new String(); 
public String isEdible = new String(); 

Scanner input = new Scanner(System.in); 

public static void main(String[] args) {new Driver();} 

public Driver() { 

    ArrayList<Plant> plantPack = new ArrayList<>(); 

    System.out.println("Welcome to the PlantPack Application."); 
    System.out.println("Please select a number from the options below."); 
    System.out.println(""); 

    while (true) { 

     System.out.println("1: Add a plant to the pack."); 
     System.out.println("2: Remove a plant from the pack."); 
     System.out.println("3: Search for a specific plant."); 
     System.out.println("4: Display your plant pack."); 
     System.out.println("5: Filter the plant pack by incomplete name."); 
     System.out.println("0: Exit the plant pack interface."); 

     // Get the user input 
     int userChoice = input.nextInt(); 

     switch (userChoice) { 
      case 1: 
       typeSwitch(plantPack); 
       break; 
      case 2: 
       removePlant(plantPack); 
       break; 
      case 3: 
       searchPlants(plantPack); 
       break; 
      case 4: 
       displayPlants(plantPack); 
       break; 
      case 5: 
       filterPlants(plantPack); 
       break; 
      case 0: 
       exitInterface(); 
       break; 
      default: 
       System.out.println("Invalid entry. \nPlease choose between 1-5, or 0: "); 
       break; 
     } 
    } 
} 
public void typeSwitch(ArrayList<Plant> plantPack) { 

    System.out.println("Please enter what type of plant you are adding: "); 
    System.out.println("1: Flower"); 
    System.out.println("2: Fungus"); 
    System.out.println("3: Weed"); 

    int type = input.nextInt(); 

    if (type >= 1 && type <= 3) { 

     switch (type) { 
      case 1: 
       addFlower(plantPack); 
       break; 
      case 2: 
       addFungus(plantPack); 
       break; 
      case 3: 
       addWeed(plantPack); 
       break; 
      } 
     } 
    else 
    { 
     System.out.println("Invalid Entry. Please choose between 1-3: "); 
     typeSwitch(plantPack); 
    } 
} 
private void addFlower(ArrayList<Plant> plantPack) { 

    Flower newFlower = new Flower(ID, name, color, smell, hasThorns, isEdible, isPoisonous, isMedicine); 

    if(plantPack.size() < 25) 
    { 
     System.out.println("Enter a unique ID number for the flower you wish to add (E.g. F1, F2, etc): "); 
     newFlower.setID(input.next().trim()); 
     input.nextLine();      //Scanner was eating first input for some reason. Had to fire a blank nextLine() to allow input for every entry, as seen in each subsequent method. 
     System.out.println("Enter the name of the flower you wish to add: "); 
     newFlower.setName(input.nextLine().trim()); 
     System.out.println("Enter the color of the flower you wish to add: "); 
     newFlower.setColor(input.nextLine().trim()); 
     System.out.println("Does the flower have a scent? Yes or No: "); 
     newFlower.setSmell(input.nextLine().trim()); 
     System.out.println("Does the flower have thorns? Yes or No: "); 
     newFlower.setThorns(input.nextLine().trim()); 
     System.out.println("Flower successfully added.\n "); 

     plantPack.add(newFlower); 
    } 
    else 
    { 
     System.out.println("You may only hold 25 items in your PlantPack. Please remove an item before adding another.\n"); 
    } 
} 
private void addFungus(ArrayList<Plant> plantPack) { 
    Fungus newFungus = new Fungus(ID, name, color, smell, hasThorns, isEdible, isPoisonous, isMedicine);//(ID, name, color, isPoisonous); 

    if(plantPack.size() < 25) 
    { 
     System.out.println("Enter a unique ID number for the Fungus you wish to add (E.g. Fn1, Fn2, etc): "); 
     newFungus.setID(input.next().trim()); 
     input.nextLine(); 
     System.out.println("Enter the name of the Fungus you wish to add: "); 
     newFungus.setName(input.nextLine().trim()); 
     System.out.println("Enter the color of the Fungus you wish to add: "); 
     newFungus.setColor(input.nextLine().trim()); 
     System.out.println("Is this particular Fungus poisonous? Yes or No: "); 
     newFungus.setIsPoisonous(input.nextLine().trim()); 
     System.out.println("Fungus successfully added.\n"); 

     plantPack.add(newFungus); 
    } 
    else 
    { 
     System.out.println("You may only hold 25 items in your plant pack. Please remove one before adding another."); 
    } 
} 
private void addWeed(ArrayList<Plant> plantPack) { 
    Weed newWeed = new Weed(ID, name, color, smell, hasThorns, isEdible, isPoisonous, isMedicine); //(ID, name, color, isEdible, isPoisonous); 

    if(plantPack.size() < 25) 
    { 
     System.out.println("Enter a unique ID number for the Weed you wish to add (E.g. W1, W2, etc): "); 
     newWeed.setID(input.next().trim()); 
     input.nextLine(); 
     System.out.println("Enter the name of the Weed you wish to add: "); 
     newWeed.setName(input.nextLine().trim()); 
     System.out.println("Enter the color of the Weed you wish to add: "); 
     newWeed.setColor(input.nextLine().trim()); 
     System.out.println("Is this particular Weed edible? Yes or No: "); 
     newWeed.setIsEdible(input.nextLine().trim()); 
     System.out.println("Is this particular Weed medicinal? Yes or No: "); 
     newWeed.setIsMedicine(input.nextLine().trim()); 
     System.out.println("Weed successfully added.\n"); 

     plantPack.add(newWeed); 
    } 
    else 
    { 
     System.out.println("You may only hold 25 items in your plant pack. Please remove one before adding another."); 
    } 
} 
private void removePlant(ArrayList<Plant> plantPack) { 

    System.out.println("Which type of Plant do you wish to remove?"); 
    System.out.println("1: Flower"); 
    System.out.println("2: Fungus"); 
    System.out.println("3: Weed"); 

    int type = input.nextInt(); 
    switch (type) { 

     case 1: 
      System.out.println("Enter the ID number of the Flower you want to remove: "); 
      String deleteFlowerID = input.next().trim(); 
      input.nextLine(); 
      System.out.println("Enter the name of the Flower you wish to remove: "); 
      String deleteName = input.nextLine().trim(); 

      boolean found = false; 

      Iterator<Plant> itr = plantPack.iterator(); //a basic for loop and .equals() would not work, and I don't understand why. I had to go with an Iterator. 
      while(itr.hasNext()) { 
       Plant flowers = itr.next(); 
       if(flowers.getID().equals(deleteFlowerID) && flowers.getName().equals(deleteName)) { 
        itr.remove(); 

        found = true; 
        break; 
       } 
      } 
      if (found) 
      { 
       System.out.println("That Flower was successfully removed from your inventory."); 
      } 
      else 
      { 
       System.out.println("That Flower was not found in your inventory."); 
      } 
      break; 
     case 2: 
      System.out.println("Enter the ID number of the Fungus you want to remove: "); 
      String deleteFungusID = input.next().trim(); 
      input.nextLine(); 
      System.out.println("Enter the name of the Fungus you wish to remove: "); 
      String deleteFungusName = input.nextLine().trim(); 

      boolean foundFungus = false; 

      Iterator<Plant> fungusItr = plantPack.iterator(); 
      while(fungusItr.hasNext()) { 
       Plant fungi = fungusItr.next(); 
       if(fungi.getID().equals(deleteFungusID) && fungi.getName().equals(deleteFungusName)) { 
        fungusItr.remove(); 

        foundFungus = true; 
        break; 
       } 
      } 
      if (foundFungus) 
      { 
       System.out.println("That Fungus was successfully removed from your inventory."); 
      } 
      else 
      { 
       System.out.println("That Fungus was not found in your inventory."); 
      } 
      break; 
     case 3: 
      System.out.println("Enter the ID number of the Weed you want to remove: "); 
      String deleteWeedID = input.next().trim(); 
      input.nextLine(); 
      System.out.println("Enter the name of the Weed you wish to remove: "); 
      String deleteWeedName = input.nextLine().trim(); 

      boolean foundWeed = false; 

      Iterator<Plant> weedItr = plantPack.iterator(); 
      while(weedItr.hasNext()) { 
       Plant weeds = weedItr.next(); 
       if(weeds.getID().equals(deleteWeedID) && weeds.getName().equals(deleteWeedName)) { 
        weedItr.remove(); 
        foundWeed = true; 
        break; 
       } 
      } 
      if (foundWeed) 
      { 
       System.out.println("That Weed was successfully removed from your inventory."); 
      } 
      else 
      { 
       System.out.println("That Weed was not found in your inventory."); 
      } 
      break; 
    } 
} 
private void searchPlants(ArrayList<Plant> plantPack) { 

    System.out.println("Please enter the ID of the plant you're searching for: "); 
    String searchID = input.next().trim(); 
    input.nextLine(); 
    boolean match = false; 
    for(int i = 0; i < plantPack.size(); i++) { 
     if(plantPack.get(i).getID().equals(searchID)) 
     { 
      match = true; 
      break; 
     } 
    } 
    if(match) 
    { 
     System.out.println("Found that one in your PlantPack!"); 
    } 
    else 
    { 
     System.out.println("Sorry, did not find that one."); 
    } 
} 
private void displayPlants(ArrayList<Plant> plantPack) { 

    for(Plant plants : plantPack) { 
     System.out.println(plants); 
    } 
} 
private void filterPlants(ArrayList<Plant> plantPack) { 

} 
private void exitInterface() { 
    System.out.println("Are you sure you want to exit the PlantPack Application? Y or N: "); 
    while(true) { 
     String answer = input.next(); 
     if(!"Y".equalsIgnoreCase(answer) && !"N".equalsIgnoreCase(answer)) 
     { 
      System.out.println("Please enter Y or N (not case-sensitive): "); 
     } 
     if("Y".equalsIgnoreCase(answer)) 
     { 
      System.out.println("Thank you for using the PlantPack Application. See ya later!"); 
      System.exit(0); 
     } 
     if("N".equalsIgnoreCase(answer)) 
     { 
      break; 
     } 
    } 
} 
} 

植物類:

public class Plant { 

public String ID; 
public String name; 
public String color; 
public String smell; 
public String hasThorns; 
public String isEdible; 
public String isPoisonous; 
public String isMedicine; 

public Plant(String ID, String name, String color, String smell, String hasThorns, String isEdible, String isPoisonous, String isMedicine) { 

    this.ID = ID; 
    this.name = name; 
    this.color = color; 
    this.smell = smell; 
    this.hasThorns = hasThorns; 
    this.isEdible = isEdible; 
    this.isPoisonous = isPoisonous; 
    this.isMedicine = isMedicine; 
} 

public void setColor(String color) {this.color = color;} 
public void setID(String ID) {this.ID = ID;} 
public void setName(String name) {this.name = name;} 

public String getID() {return ID;} 
public String getName() {return name;} 
public String getColor() { 
    return color; 
} 

public String toString() { 
    return "ID: " + this.ID + ", Name: " + this.name + ", Color " + this.color; 
} 

} 

和花類:

public class Flower extends Plant { 

public Flower(String ID, String name, String color, String smell, String hasThorns, String isEdible, String isPoisonous, String isMedicine) { 

    super(ID, name, color, smell, hasThorns, isEdible, isPoisonous, isMedicine); 

    } 
    public void setSmell(String smell) {this.smell = smell;} 
    public void setThorns(String hasThorns) { 
    this.hasThorns = hasThorns; 
} 
public String getSmell() { 
    return smell; 
} 
public String getHasThorns() { 
    return hasThorns; 
} 
public String toString() { 
    return super.toString() + ", Scent? " + this.smell + ", Thorns? " + this.hasThorns; 
} 
} 

這是使用input.nextLine()時的輸出:

Welcome to the PlantPack Application. 
    Please select a number from the options below. 

    1: Add a plant to the pack. 
    2: Remove a plant from the pack. 
    3: Search for a specific plant. 
    4: Display your plant pack. 
    5: Filter the plant pack by incomplete name. 
    0: Exit the plant pack interface. 
    1 
    Please enter what type of plant you are adding: 
    1: Flower 
    2: Fungus 
    3: Weed 
    1 
    Enter a unique ID number for the flower you wish to add (E.g. F1, F2, etc): 
    F1 
    Enter the name of the flower you wish to add: 
    rose 
    Enter the color of the flower you wish to add: 
    red 
    Does the flower have a scent? Yes or No: 
    yes 
    Does the flower have thorns? Yes or No: 
    yes 
    Flower successfully added. 

    1: Add a plant to the pack. 
    2: Remove a plant from the pack. 
    3: Search for a specific plant. 
    4: Display your plant pack. 
    5: Filter the plant pack by incomplete name. 
    0: Exit the plant pack interface. 
    4 
    ID: F1, Name: rose, Color red, Scent? yes, Thorns? yes 
    1: Add a plant to the pack. 
    2: Remove a plant from the pack. 
    3: Search for a specific plant. 
    4: Display your plant pack. 
    5: Filter the plant pack by incomplete name. 
    0: Exit the plant pack interface. 
    3 
    Please enter the ID of the plant you're searching for: 
    F1 
    Sorry, did not find that one. 

現在,同樣的事情,但input.next()代替:

Please enter the ID of the plant you're searching for: 
    F1 
    Found that one in your PlantPack! 
+1

你輸入了什麼?它包含多個單詞嗎? – Eran

+1

與其給我們一個片段,請提供一個簡短但完整的程序,它不會*顯示問題。我們無法分辨這裏有什麼問題 - 無論在哪種情況下,您都沒有告訴我們您所觀察到的「searchID」的值無關緊要。 –

+0

過去我收到了一個「詢問正確的問題」的鏈接,因爲它「太長」了,所以我害怕被低估。我將編輯它以包含所有內容。 – IRGeekSauce

回答

1

程序 「吃掉」 你的新生產線。這會導致程序跳過一行。

如果輸入: input.nextLine(); input.nextLine(); (是的兩倍)

它應該工作

+0

這就是我最終做的。 :-) – IRGeekSauce

+0

很高興我能幫忙:-) – JJ72

相關問題