Удаление элемента в ArrayList путем поиска переменной класса - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь найти собаку в ArrayList и затем либо удалить ее, либо увеличить ее возраст в зависимости от того, какой метод вызывается.

Сейчас я могу только удалить / увеличить возраст первой собаки в ArrayList. Когда я ищу Турбо или Каспера, они не появляются. Я предполагаю, что по какой-то причине они не попадают в петлю.

Основной класс:

public class main {
    public static void main(String[] args) {
        DogShell dogShell = new DogShell();
        Dog fidoDog = new Dog("Fido", "schäfer", 7, 27);
        Dog turboDog = new Dog("Turbo", "bulldog", 12, 33);
        Dog kasperDog = new Dog("Kasper", "sheepdog", 5, 4);
        dogShell.dogArrayList.add(fidoDog);
        dogShell.dogArrayList.add(turboDog);
        dogShell.dogArrayList.add(kasperDog);


        dogShell.initialize();
        dogShell.runCommandLoop();
        dogShell.shutDown();
    }
}

Класс собаки:

public class Dog {
    // Fields
    private String name, breed;
    private int age;
    private int weight;

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

    // Methods
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getBreed() {
        return breed;
    }

    public int getWeight() {
        return weight;
    }

    public double getTailLength() {
        double taxTailLength = 3.7;
        double tailLength = ((double) age * (double) weight) / 10;
        if (breed.equalsIgnoreCase("tax") || breed.equalsIgnoreCase("dachshund")) {
            return taxTailLength;
        } else {
            return tailLength;
        }
    }

    public String toString() {
        String result = "";
        result ="\nName: " + name + "\nBreed: " + breed + "\nAge: " + age + " years" + "\nWeight: " + weight + " kg" + "\nTail length: " + getTailLength() + "\n";
        return result;
    }
    // Increases age by one year.
    public int increaseAge() {
        return this.age++;
    }
}

Класс DogShell:

import java.util.*;

public class DogShell {

    ArrayList<Dog> dogArrayList = new ArrayList<Dog>();
    Iterator<Dog> iterator = dogArrayList.iterator();
    Scanner scanner = new Scanner(System.in);

    public DogShell() {
    }

    public void initialize() {
        System.out.println("Welcome to the dog register!");

    }

    public void runCommandLoop() {
        Scanner scanner = new Scanner(System.in);
        String input;
        do {
            System.out.print("Command> ");
            input = scanner.nextLine();
            switch (input) {
                case "exit":
                    break;
                case "remove dog":
                    removeDogs();
                    break;
                case "list dogs":
                    listDogs();
                    break;
                case "increase age":
                    increaseAge();
                    break;
                case "register new dog":
                    registerDog();
                    break;
                default:
                    System.out.println("Error: unknown command " + "\"" + input + "\"");
                    break;
            }
        } while (!input.equalsIgnoreCase("exit"));

    }

    public void shutDown() {
        System.out.println("Goodbye!");
    }

    public void registerDog() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("You gave the command \"register new dog\"");
        System.out.println("Name: ");
        String dName = scanner.nextLine();
        System.out.println("Breed: ");
        String dBreed = scanner.nextLine();
        System.out.println("Age: ");
        int dAge = scanner.nextInt();
        System.out.println("Weight: ");
        int dWeight = scanner.nextInt();

        dogArrayList.add(new Dog(dName, dBreed, dAge, dWeight));
    }

    public void listDogs() {
        System.out.println("You gave the command \"list dogs\"");
        System.out.println(Arrays.toString(dogArrayList.toArray()));
    }

    public void increaseAge() {
        System.out.println("Enter the name of the dog you want to age: ");
        String name = scanner.nextLine();
        for (int i = 0; i < dogArrayList.size(); i++) {
            String dogName = dogArrayList.get(i).getName();
            if (name.equalsIgnoreCase(dogArrayList.get(i).getName())) {
                dogArrayList.get(i).increaseAge();
                System.out.println(dogArrayList.get(i).getName() + " is now " + dogArrayList.get(i).getAge() + " years old");
                break;
            } else {
                System.out.println("Error: no dog called " + name);
                break;
            }
        }
    }

    public void removeDogs() {
        String name;
        System.out.println("What is the name of the dog you want to delete");
        name = scanner.nextLine();
        for (int i = 0; i < dogArrayList.size(); i++) {
            String dogName = dogArrayList.get(i).getName();
            if (name.equalsIgnoreCase(dogArrayList.get(i).getName())) {
                dogArrayList.remove(dogArrayList.get(i));
                System.out.println(name + " has been deleted.");
                break;
            } else {
                System.out.println("Error: no dog with " + name + " name.");
                break;
            }
        }
    }


}

Вывод при выполнении и тестировании

Welcome to the dog register!

Command> list dogs

You gave the command "list dogs"

[

Name: Fido

Breed: schäfer

Age: 7 years

Weight: 27 kg

Tail length: 18.9

, 

Name: Turbo

Breed: bulldog

Age: 12 years

Weight: 33 kg

Tail length: 39.6

, 

Name: Kasper

Breed: sheepdog

Age: 5 years

Weight: 4 kg

Tail length: 2.0

]

Command> register new dog

You gave the command "register new dog"

Name: 

stack

Breed: 

overflow

Age: 

13

Weight: 

37

Command> list dogs

You gave the command "list dogs"

[

Name: Fido

Breed: schäfer

Age: 7 years

Weight: 27 kg

Tail length: 18.9

, 

Name: Turbo

Breed: bulldog

Age: 12 years

Weight: 33 kg

Tail length: 39.6

, 

Name: Kasper

Breed: sheepdog

Age: 5 years

Weight: 4 kg

Tail length: 2.0

, 

Name: stack

Breed: overflow

Age: 13 years

Weight: 37 kg

Tail length: 48.1

]

Command> increase age

Enter the name of the dog you want to age: 

stack

Error: no dog called stack

Command> increase age

Enter the name of the dog you want to age: 

fido

Fido is now 8 years old

Command> remove dog

What is the name of the dog you want to delete

stack

Error: no dog with stack name.

Command> remove dog

What is the name of the dog you want to delete

fido

fido has been deleted.

Command> list dogs

You gave the command "list dogs"

[

Name: Turbo

Breed: bulldog

Age: 12 years

Weight: 33 kg

Tail length: 39.6

, 

Name: Kasper

Breed: sheepdog

Age: 5 years

Weight: 4 kg

Tail length: 2.0

, 

Name: stack

Breed: overflow

Age: 13 years

Weight: 37 kg

Tail length: 48.1

]

Command> exit

Goodbye!

Ответы [ 2 ]

0 голосов
/ 17 января 2019

В дополнение к тому, что @glglgl сказал:

Если вы пишете один и тот же кусок кода снова и снова, вы должны использовать метод. Не повторяйте себя! Я предлагаю создать метод для поиска собак, например:

public Dog findDogByName(String name) throws NoSuchElementException{
    for (int i = 0; i < dogArrayList.size(); i++) {
        Dog dog = dogArrayList.get(i);
        if (name.equalsIgnoreCase(dog.getName())) {
            return dog;
        }
    }
    throw new NoSuchElementException("Error: no dog called " + name); //or return null
}

Тогда вместо циклов везде вы можете получить что-то вроде этого:

public void increaseAge() {
    System.out.println("Enter the name of the dog you want to age: ");
    String name = scanner.nextLine();
    try {
        Dog dog = findDogByName(name);
        dog.increaseAge();
        System.out.println(dog.getName() + " is now " + dog.getAge() + " years old");
    } catch(NoSuchElementException ex) {
        System.out.println(ex.getMessage());

    }
}

Чтобы обработать недопустимые элементы, вы можете либо сгенерировать исключение, как у меня, либо вернуть null и проверить это при вызове метода find.У каждого варианта есть свои плюсы и минусы, и я оставлю вам решать, что вы предпочитаете.

0 голосов
/ 17 января 2019

Это потому, что вы слишком нетерпеливы. : -)

В

for (int i = 0; i < dogArrayList.size(); i++) {
    String dogName = dogArrayList.get(i).getName();
    if (name.equalsIgnoreCase(dogArrayList.get(i).getName())) {
        dogArrayList.get(i).increaseAge();
        System.out.println(dogArrayList.get(i).getName() + " is now " + dogArrayList.get(i).getAge() + " years old");
        break;
    } else {
        System.out.println("Error: no dog called " + name);
        break;
    }
}

если сравнение не удастся, вы не дадите циклу возможность перейти к следующему элементу, но вы уже выведете, что собака не найдена.

Вместо этого вы должны сделать

for (int i = 0; i < dogArrayList.size(); i++) {
    String dogName = dogArrayList.get(i).getName();
    if (name.equalsIgnoreCase(dogArrayList.get(i).getName())) {
        dogArrayList.get(i).increaseAge();
        System.out.println(dogArrayList.get(i).getName() + " is now " + dogArrayList.get(i).getAge() + " years old");
        break;
    }
}
// Only now, after the loop, we are sure that there is no dog with the given name.
System.out.println("Error: no dog called " + name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...