Java программа не сохраняет объект в HashMap - PullRequest
0 голосов
/ 28 мая 2020

Либо моя функция save_product в моем классе Repository.java не сохраняется правильно на карту product_repository, либо, возможно, она сохраняется, но я неправильно выводю ее в своей функции find_product в моем Repository.java класс. Я думаю, что использую правильную функцию для поиска значения на карте, .get

Я экспериментировал с product_repository.keySet().iterator().forEachRemaining(System.out::println);, но это был первый раз, когда я использовал это ... также, пожалуйста, простите, как я вставьте key в карту product_repository в функцию create_new_product в классе Controller.java. Я новичок в java ...

Main. java

package com.company;

public class Main {

    public static void main(String[] args) {
    // write your code here
        Controller controller = new Controller();
        controller.create_new_product();
        controller.search_product();
    }
}

Product. java

package com.company;

public class Product {
    private String product_name;
    private String product_brand;
    private int product_cost;
    private int product_count;
    private boolean product_availability;

    public Product() {
    }

    public Product(String product_name, String product_brand,
                   int product_cost, int product_count, boolean product_availability) {
        this.product_name = product_name;
        this.product_brand = product_brand;
        this.product_cost = product_cost;
        this.product_count = product_count;
        this.product_availability = product_availability;
    }

    public String getProduct_name() {
        return product_name;
    }

    public void setProduct_name(String product_name) {
        this.product_name = product_name;
    }

    public String getProduct_brand() {
        return product_brand;
    }

    public void setProduct_brand(String product_brand) {
        this.product_brand = product_brand;
    }

    public int getProduct_cost() {
        return product_cost;
    }

    public void setProduct_cost(int product_cost) {
        this.product_cost = product_cost;
    }

    public int getProduct_count() {
        return product_count;
    }

    public void setProduct_count(int product_count) {
        this.product_count = product_count;
    }

    public boolean isProduct_availability() {
        return product_availability;
    }

    public void setProduct_availability(boolean product_availability) {
        this.product_availability = product_availability;
    }
}

Controller. java

package com.company;

import java.util.Scanner;

public class Controller {
    private static Long key;

    public static void create_new_product(){
        Repository repository = new Repository();
        //Supplier supplier = new Supplier();
        Product product = new Product();
        Scanner scanner = new Scanner(System.in);
        key = 0L;

        System.out.println("*****************************************************************");
        System.out.println("********************NEW PRODUCT CREATION PAGE********************");
        System.out.println("*****************************************************************");

        System.out.println("Enter product name: ");
        String name = scanner.nextLine();
        product.setProduct_name(name);

        System.out.println("Enter product brand: ");
        String brand = scanner.nextLine();
        product.setProduct_brand(brand);

        System.out.println("Enter product cost: ");
        int cost = scanner.nextInt();
        product.setProduct_cost(cost);

        System.out.println("Enter amount of products in stock: ");
        int amount = scanner.nextInt();
        product.setProduct_count(amount);

        key++;
        repository.save_product(key, product);
    }

    public void search_product(){
        Repository repository = new Repository();
        Product product = new Product();
        Scanner scanner = new Scanner(System.in);

        System.out.println("*****************************************************************");
        System.out.println("*************************FIND PRODUCT PAGE***********************");
        System.out.println("*****************************************************************");
        // TO DO: Choices or if/else blocks not executing properly
        System.out.println("\nSearch by ID or name?\nPress '1' for ID. Press '2' for name: ");
        String choice = scanner.next();
        if (choice.equals("1")) {
            System.out.println("Enter product id: ");
            Long id = scanner.nextLong();
            repository.find_product(id);

            try{
                if (product.getProduct_count() > 0){
                    System.out.println(product.getProduct_name() + " are in stock!");
                }
            } catch (Exception e) {
                System.out.println(product.getProduct_name() + " are out of stock.");
            }
        }

        else if (choice.equals("2")) {
            System.out.println("Enter product name: ");
            String name = scanner.next();
            repository.find_product(name);

            try{
                if (product.getProduct_count() > 0){
                    System.out.println(product.getProduct_name() + " are in stock!");
                }
            } catch (Exception e) {
                System.out.println(product.getProduct_name() + " are out of stock.");
            }
        }
        else {
            System.out.println("Error. We apologize for the inconvenience.");
        }
    }
}

Репозиторий. java

package com.company;

import java.util.HashMap;
import java.util.Map;

public class Repository {
    private Map<Long, Product> product_repository = new HashMap<Long, Product>();

    // TO DO: Implement while loops so program doesn't exit at the first error

    public void save_product(Long key, Product newProductMap){
        try{
            if (product_repository.containsValue(newProductMap)) {
                System.out.println("This product is already in the system." +
                        "\nFor safety reasons, we cannot add the same product twice.");
            }
            else {
                product_repository.put(key, newProductMap);
            }
        } catch (Exception e) {
            System.out.println("System error. Consult the database administrator.");
        }
    }

    public void find_product(Long key){
        try {
            if (product_repository.containsKey(key)) {
                System.out.println(product_repository.get(key));
            }
            else {
                System.out.println("No matches were found for product id: " + key);
            }
        } catch (Exception e) {
            System.out.println("System error. Consult the database administrator.");
        }
    }

    // Overload
    public void find_product(String name) {
        try {
            if (product_repository.containsValue(name)) {
                System.out.println(product_repository.get(name));
                product_repository.keySet().iterator().forEachRemaining(System.out::println);
            }
            else {
                System.out.println("No matches were found for product name: " + name);
            }
        } catch (Exception e) {
            System.out.println("System error. Consult the database administrator.");
        }
    }
}

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Вы должны сделать Repository repository полем вашего класса Controller. В настоящее время вы выбрасываете репозитории после выполнения ваших методов create_new_product и search_product. Поэтому вам необходимо удалить первую строку каждого из этих методов.

Другая проблема находится внутри вашего find_product(String name) метода, где ваш вызов product_repository.get(name), но имя String, а метод get ожидает ID, то есть Long, поэтому этот вызов всегда будет возвращать null.

0 голосов
/ 28 мая 2020

Как было указано перед тем, как сделать репозиторий глобальным. Однако весь код немного запутан. Вы ищете идентификатор продукта, но он не отображается. Это похоже на поиск записей в базе данных, но идентификаторы генерируются автоматически. Удачи с этим. Поэтому я бы посоветовал разрешить этой программе также вводить идентификатор. Это имеет гораздо больше смысла, если вы хотите искать идентификатор. В противном случае, если вас интересует только значение, идентификатор можно вынуть. Ниже вы можете найти измененный код, который работает для всех методов.

 //main stays the same
 public class Main {

    public static void main(String[] args) {
        // write your code here
        Controller controller = new Controller();
        controller.create_new_product();
        controller.search_product();
    }

}


 //controller is a bit changed. Added global repository and improved the search.
import java.util.Collection;
import java.util.Scanner;

public class Controller {
    private static Long key;

    Repository repository = new Repository();

    public void create_new_product() {
        Product product = new Product();
        Scanner scanner = new Scanner(System.in);

        System.out.println("*****************************************************************");
        System.out.println("********************NEW PRODUCT CREATION PAGE********************");
        System.out.println("*****************************************************************");
        System.out.println("Enter product id: ");
        long id = Long.parseLong(scanner.nextLine());
        product.setProductId(id);

        System.out.println("Enter product name: ");
        String name = scanner.nextLine();
        product.setProduct_name(name);

        System.out.println("Enter product brand: ");
        String brand = scanner.nextLine();
        product.setProduct_brand(brand);

        System.out.println("Enter product cost: ");
        int cost = scanner.nextInt();
        product.setProduct_cost(cost);

        System.out.println("Enter amount of products in stock: ");
        int amount = scanner.nextInt();
        product.setProduct_count(amount);

        repository.save_product(id, product);
    }

    public void search_product() {
        Scanner scanner = new Scanner(System.in);

        System.out.println("*****************************************************************");
        System.out.println("*************************FIND PRODUCT PAGE***********************");
        System.out.println("*****************************************************************");
        // TO DO: Choices or if/else blocks not executing properly
        System.out.println("\nSearch by ID or name?\nPress '1' for ID. Press '2' for name: ");
        String choice = scanner.next();
        if (choice.equals("1")) {
            System.out.println("Enter product id: ");
            Long id = scanner.nextLong();
            Product product = repository.find_product(id);

            try {
                if (product.getProduct_count() > 0) {
                    System.out.println(product.getProduct_name() + " are in stock!");
                }
            } catch (Exception e) {
                System.out.println(product.getProduct_name() + " are out of stock.");
            }
        } else if (choice.equals("2")) {
            System.out.println("Enter product name: ");
            String name = scanner.next();
            Collection<Product> products = repository.find_products(name);

            if (products.size() > 0) {
                for (Product product : products) {
                    System.out.println(product.getProduct_name() + " are in stock!");
                }
            } else {
                System.out.println(" out of stock.");

            }
        } else {
            System.out.println("Error. We apologize for the inconvenience.");
        }
    }
}


//Added a new field to the Repository so you can also search by key.
import java.util.*;

public class Repository {
    private Map<Long, Product> product_repository = new HashMap<Long, Product>();

    // TO DO: Implement while loops so program doesn't exit at the first error

    public void save_product(Long key, Product newProductMap) {
        try {
            if (!product_repository.containsKey(key)) {
                product_repository.put(key, newProductMap);
            } else {
                System.out.println("This product is already in the system." +
                        "\nFor safety reasons, we cannot add the same product twice.");
            }
        } catch (Exception e) {
            System.out.println("System error. Consult the database administrator.");
        }
    }

    public Product find_product(final Long key) {
        try {
            if (product_repository.containsKey(key)) {
                System.out.println("Found product: " + product_repository.get(key).getProduct_name());
                return product_repository.get(key);
            } else {
                System.out.println("No matches were found for product id: " + key);
            }
        } catch (Exception e) {
            System.out.println("System error. Consult the database administrator.");
        }
        return null;
    }

    // Overload
    public Collection<Product> find_products(final String name) {
        Collection<Product> values = new ArrayList<>();
        for (Map.Entry<Long, Product> productEntry : product_repository.entrySet()) {
            if (productEntry.getValue().getProduct_name().equals(name)) {
                System.out.println("matches were found for product name: " + name);
                values.add(productEntry.getValue());
            }
        }
        return values;
    }
}
...