2016-12-06 9 views
-1

私は3匹の犬のうちArraylistを持っています。私はリストにもっと犬を登録し、toString関数を呼び出すことによってそれらをリストアップし、犬の年齢を1つ上げ、リストから犬を取り除くことができます。最後の2つのものを使用している限り、remove()increaseAge()はどちらも動作しますが、他のコマンドを使用すると直ちに犬を見つけることができず、犬を見つけることができず、与えられた名前で犬を見つける。だからそれは奇妙なremove()increaseAge()です。最初の入力後にこれらの機能が動作しないのは何ですか?

メインコード:

public class DogTest { 

    public static void main(String[] args) { 

     Scanner keyboard = new Scanner(System.in); 
     ArrayList<Dog> Dogs = new ArrayList<Dog>(); 
     DogFunctions DF = new DogFunctions(); 
     Dogs.add(new Dog("Peggy", "Labrador", 9, 30)); 
     Dogs.add(new Dog("Max", "Tax", 4, 13)); 
     Dogs.add(new Dog("Sanna", "Schäfer", 7, 25)); 
     Boolean loop = true; 

     while(loop){ 
      String input = keyboard.nextLine(); 
      switch (input){ 
       case "Register": 
        Dogs.add(DF.register()); 
        break; 
       case "IncreaseAge":   
        Dogs.get(DF.returnDogIndex(Dogs, "Input Message", "Output Message")).increaseAge(); 
        break; 
       case "List": 
        DF.list(Dogs); 
        break; 
       case "Remove": 
        Dogs.remove(DF.returnDogIndex(Dogs, "Input Message", "Output Message")); 
        break; 
       case "Quit": 
        loop = false; 
        break; 
      } 

     } 
     keyboard.close(); 
    } 

} 

コードの機能のために:

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

public class DogFunctions { 

    private Scanner keyboard = new Scanner(System.in); 

    public Dog register(){ 
     System.out.println("Namn:"); 
     String name = keyboard.nextLine(); 
     System.out.println("Ras:"); 
     String breed = keyboard.nextLine(); 
     System.out.println("Ålder:"); 
     int age = keyboard.nextInt(); 
     System.out.println("Vikt:"); 
     double weight = keyboard.nextDouble(); 
     Dog d = new Dog(name, breed, age, weight); 
     System.out.println("Hund tillagd i registret"); 
     return d; 
    } 

    public void list(ArrayList<Dog> Dogs){ 
     System.out.println("Ange svanslängd:"); 
     double input = keyboard.nextDouble(); 
     if(input == 0){ 
      for (int i = 0; i < Dogs.size(); i++){ 
       System.out.println(Dogs.get(i).toString()); 
      } 
     } 
     else{ 
      for (int i = 0; i < Dogs.size(); i++){ 
       if(Dogs.get(i).getTailLenght() >= input){ 
        System.out.println(Dogs.get(i).toString()); 
       } 
      } 
     } 

    } 

    public int returnDogIndex(ArrayList<Dog> Dogs, String inputMessage, String outputMessage){ 
     System.out.println(inputMessage); 
     String input = keyboard.nextLine(); 
     for(int i = 0; i < Dogs.size(); i++){ 
      if(input.equals(Dogs.get(i).getName())){ 
       System.out.println(outputMessage); 
       return i; 
      } 
     } 
     return -1; 
    } 

} 

それは私がと間違って何かだと思い、この最後の関数 "returnDogIndex" です。 Dogクラスのための

コード:あなたが戻ってきている-1あなたは犬を見つけていない指標として

public class Dog { 

    private String breed, name; 
    private int age; 
    private double weight, tailLength; 

    public Dog(String name, String breed, int age, double weight) { 
     this.name = name; 

     this.breed = breed; 
     this.age = age; 
     this.weight = weight; 
     calcTailLength(); 
    } 

    public void calcTailLength(){ 
     if (breed.toLowerCase().equals("tax")) { 
      tailLength = 3.7; 
     } 
     else { 
      tailLength = (age*weight)/10; 
     } 
    } 

    public String toString() { 
     return name + " är en " + age + " år gammal " + breed + " som väger " + weight + " kg och har en svanslängd på " + tailLength; 
    } 

    public String getName() { 
     return name; 
    } 

    public void increaseAge(){ 
     age++; 
     calcTailLength(); 
    } 

    public double getTailLenght(){ 
     return tailLength; 
    } 

} 
+0

? "リスト"と "削除"? – Olof

+0

て申し訳ありません

public Dog register(){ System.out.println("Namn:"); String name = keyboard.nextLine(); System.out.println("Ras:"); String breed = keyboard.nextLine(); System.out.println("Ålder:"); int age = keyboard.nextInt();keyboard.nextLine(); System.out.println("Vikt:"); double weight = keyboard.nextDouble();keyboard.nextLine(); Dog d = new Dog(name, breed, age, weight); System.out.println("Hund tillagd i registret"); return d; } public void list(ArrayList<Dog> Dogs){ System.out.println("Ange svanslängd:"); double input = keyboard.nextDouble();keyboard.nextLine(); if(input == 0){ for (int i = 0; i < Dogs.size(); i++){ System.out.println(Dogs.get(i).toString()); } } else{ for (int i = 0; i < Dogs.size(); i++){ if(Dogs.get(i).getTailLenght() >= input){ System.out.println(Dogs.get(i).toString()); } } } } 

+0

私はそれらがすべて欲しいです、彼らは割り当ての一部なので。しかし、以前に言及されていないコマンドが入力された後は、 "Remove"と "Increase Age"は機能しません。 – Olof

答えて

1

。これが最初のエラーです。アレイのためのJavaでのインデックスやArrayListのはこのため帰国、0から始まり-1このほかに、あなたには、ArrayIndexOutOfBoundsException例外を与える

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: -1 
at java.util.ArrayList.elementData(ArrayList.java:382) 
at java.util.ArrayList.remove(ArrayList.java:459) 
at com.daimler.iqm.service.DogExec.main(DogExec.java:30) 

あなたがやっている最大の過ちは、特定のTYE

の入力を取得するためのステップであります
keyboard.nextDouble(), keyboard.nextInt() 

私はあなたの問題を理解し、解決するには、これらの2つのStackOverflowのスレッドを経ることをお勧めします

Scanner is skipping nextLine() after using next(), nextInt() or other nextFoo() methods

あなたは2つの方法は、登録し、リストとnextIntまたはnextDoubleの各呼び出しの後 keyboard.nextLine()を追加修正する必要があると述べ

Java String Scanner input does not wait for info

例は、あなたがやりたいことはありません悪いタイトルと、そのような
+0

重複する質問への回答の投稿を停止し、代わりにそれらにフラグを付けます。 – Tom

+0

@Tom、これは重複した質問です – Acewin

+0

リンクされた質問の回答を読んで、説明された問題をどのように修正したかを確認し、説明された問題の修正方法を確認してください。そうでない場合は、ヘルプページで重複した質問を確認してください:http://stackoverflow.com/help/duplicates – Tom

関連する問題