Поиск по списку объектов не работает - PullRequest
0 голосов
/ 25 октября 2019

Я столкнулся с определенной проблемой, когда включается только первый элемент в Arraylist, когда речь идет об итерации каждого элемента в Arraylist (для поиска / удаления). Это означает, что второй, пока n-1 итераций не будет найден, когда я попытаюсь выполнить итерацию. Отредактировано: в настоящее время улучшается мой код.

Вы можете попробовать следующую программу. Это отлично работает только при добавлении первой записи заказа: я могу удалить и искать его значения. Однако при добавлении второго порядка: я не могу удалить и искать его значения, скорее он не найден.

Исходный код

import java.util.*;
import java.io.*;

public class TestOrders {
    public static void main(String[] args) throws FileNotFoundException, IOException, NoSuchElementException {

        File afile = new File("order.txt");
        FileOutputStream outFile = new FileOutputStream("order.txt");
        ObjectOutputStream outStream = new ObjectOutputStream(outFile);

        FileInputStream inFile = new FileInputStream("order.txt");
        ObjectInputStream inStream = new ObjectInputStream(inFile);

        //Create an arraylist of order
        ArrayList<Order> theorder = new ArrayList<>();

        Scanner scan = new Scanner(System.in);

        System.out.println("Welcome to Order");
        System.out.println("Please choose an option (1-5): ");
        int choice = 0;
        try {
            while (choice != 5) {   
                //A list of options 
                System.out.println("\n1. Add a new order: ");
                System.out.println("2. Search an order: ");
                System.out.println("3. Compute sum of all orders:");
                System.out.println("4. Remove an order: ");
                System.out.println("5. Exit: ");

                //prompt user
                System.out.print("Pick a number: ");
                if (scan.hasNextInt()) {
                    choice = scan.nextInt();
                }

                switch(choice) {

                    case 1:
                        addNewOrder(outStream, theorder);
                        break;
                    case 2:
                        searchOrder(outStream, inStream, theorder);
                        break;
                    case 3:
                        computeSum(afile, theorder);
                        break;
                    case 4:
                        removeOrder(outStream, inStream, theorder);
                        break;
                    case 5: 
                        System.exit(0);
                        break;
                    default:
                        System.out.println("Please enter from (1-5)");
                }
            }
        } catch (IOException | InputMismatchException ex) {
                System.out.println(ex);
        } finally {
                if (choice == 5) {
                    scan.close();
                    outStream.close();
                    inStream.close();
                }
        }
    }

    public static void addNewOrder(ObjectOutputStream outStream, ArrayList<Order> theorder) throws IOException {

            Scanner input = new Scanner(System.in);
            Order anorder = new Order();

            System.out.print("Enter the order ID: ");       
            anorder.setOrderID(input.nextInt());
            input.nextLine();

            System.out.print("Enter the customer name: ");      
            anorder.setCustomerName(input.nextLine());

            System.out.print("Enter the order (meal/drink): ");
            anorder.setOrderType(input.nextLine());

            System.out.print("Enter the order price: ");
            anorder.setPrice(input.nextDouble());

            if(theorder.size() <= 1000) {
                theorder.add(anorder);
                outStream.writeObject(anorder);
                System.out.println("Order information saved.\n");
            } else {
                System.out.println("There is not enough space.");
            }
    }

    public static void searchOrder(ObjectOutputStream outStream, ObjectInputStream inStream, ArrayList<Order> theorder) throws FileNotFoundException {


        Scanner input = new Scanner(System.in);
        Order o = new Order();

        System.out.println("Please enter a customer ID: ");
        int custID = input.nextInt();

        for (Order or : theorder) {
            if(or.getOrderID() == custID) {
                System.out.println(or.toString());
                break;
            } else {
                System.out.println("No matching record found");
                break;
            }
        }
    }

    public static void computeSum(File aFile, ArrayList<Order> theorder) throws FileNotFoundException, IOException {

            double sum = 0;

            for (Order o : theorder) {
                    sum += o.getPrice();        
            }

            sum = (double) Math.round(sum*100)/100;

            System.out.println("The total sum of price for " + theorder.size() + " orders is " + sum);
    }

    public static void removeOrder(ObjectOutputStream outStream, ObjectInputStream inStream, ArrayList<Order> theorder) {

            Iterator<Order> iterator = theorder.iterator(); 
            Scanner input = new Scanner(System.in);

            System.out.println("Enter the order ID to remove: ");
            int custID = input.nextInt();

            while (iterator.hasNext()) {
                Order anorder = iterator.next();
                if(anorder.getOrderID() == custID) {
                    theorder.remove(anorder);
                    System.out.println(anorder.toString());
                    break;          
                } else {
                    System.out.println("Not found\n");
                    break;
                }
            }

            for (Order o : theorder) {
                System.out.println(o.toString());
            }
    }
}

Класс заказа

import java.util.*;
import java.io.*;

public class Order implements Serializable {
    private int orderID;
    private String customerName;
    private String orderType;
    private double price;

    public Order() {
    }

    public Order(int orderID, String customerName, String orderType, double price) {
        this.orderID = orderID;
        this.customerName = customerName;
        this.orderType = orderType;
        this.price = price;
    }

    public int getOrderID() {
        return orderID;
    }

    public void setOrderID(int orderID) {
        this.orderID = orderID;
    }

    public String getCustomerName() {
        return this.customerName;
    }

    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    public String getOrderType() {
        return this.orderType;
    }

    public void setOrderType(String orderType) {
        this.orderType = orderType;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String toString() {
        return this.orderID + " " + this.customerName + " " + this.orderType + " " + this.price + "\n";
    }
}

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

                for (Order o : theorder) {
                if(o.getOrderID() == orderIDSearch) {
                    theorder.remove(orderIDSearch);
                    System.out.println("Order has been successfully removed");              
                    continue;
                } else {
                        System.out.println("Not found ");
                        break;
                }
            }

Что я должен сделать, чтобы решить эту проблему? есть ли способ это решить?

Ответы [ 2 ]

1 голос
/ 25 октября 2019
for ( Order o : theorder ) {
    if ( o.getOrderID() == orderIDSearch ) {
        theorder.remove(orderIDSearch);
        System.out.println("Order has been successfully removed");              
        continue;
    } else {
        System.out.println("Not found ");
        break;
    }
}

Здесь есть несколько проблем:

Во-первых, удаление элемента коллекции во время итерации по коллекции требует другой техники, чем вы используете. Как правило, изменение коллекции во время итерации приводит к ConcurrentModificationException.

Во-вторых, ожидаются ли множественные совпадения? Если найдено не более одного совпадения, continue должно быть break.

В-третьих, можно ожидать, что код продолжит работу со следующими элементами, если текущий элемент не совпадает. То есть break должен быть continue, или, что еще лучше, должен быть полностью удален.

В-четвертых, неясно, что theorder.remove(orderIDSearch) будет делать что-либо, если тип коллекции не имеет remove операция, которая принимает значение ключа вместо значения элемента. Для базовых типов коллекций (List, Set) вызов ничего не сделает.

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

Если итератор поддерживает удаление:

Iterator<Order> orders = theorder.iterator();
boolean found = false;
while ( !found && orders.hasNext() ) {
    if ( orders.next().getOrderID() == orderIDSearch ) {
        found = true;
    }
}
if ( found ) {
    orders.remove();
    System.out.println("Found and removed [ " + orderIDSearch + " ]");
} else {
    System.out.println("Not found [ " + orderIDSearch + " ]");
}

Если итератор не поддерживает удаление, то:

boolean found = false;
for ( Order o : theorder ) {
    if ( o.getOrderID() == orderIDSearch ) {
        found = true;
        break;            
    }
}
if ( found ) {
    theorder.remove(orderIDSearch);
    System.out.println("Found and removed [ " + orderIDSearch + " ]");
} else {
    System.out.println("Not found [ " + orderIDSearch + " ]");
}

Обратите внимание, что это зависит от remove принятия ключа в качестве значения параметра.

0 голосов
/ 25 октября 2019

Вы прерываете цикл для поиска в другом состоянии. Зачем тебе это делать .. Удалить остальную часть

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...