Удаление строки данных из списка массивов - PullRequest
2 голосов
/ 07 января 2012

Я создал программу для добавления поиска, удаления заказов и т. Д. После нескольких часов я наконец-то подумал, что добился прогресса, но когда я удаляю бронирование, моя программа находит правильное бронирование, возвращает правильную информацию для этого бронирования, но удаляетдругое бронирование.

Я вложил файлы в zip-файл, как если бы я отображал их, они заняли бы много места на экране.Программа была сделана на BlueJay.

Код для объявления и добавления объектов в мой список массивов

public Hostel(String hostelName)
{
    this.hostelName = "Newcastle Hostel";
    bookings = new ArrayList<Booking>();
}
public String getHostelName()
{
    return hostelName;
}
public String addBooking(String roomID, String roomType, String guest)
{
    if (roomID.equals(""))
        return "Error Please Entre Room ID";

    else if (roomType.equals(""))
        return "Error Please Entre Room Type";

    else if (guest.equals(""))
        return "Error Please Entre Guest Name";

    bookings.add(new Booking(roomID,roomType,guest));
    return "Room " + roomID + " " + roomType + " Has Been Booked For " + guest;
}

Это взято из класса моего хостела

public String deleteBooking(String roomID)
{
    int index = 0;
    for ( Booking s : bookings )
    {
        if ( s.getRoomID().equals(roomID))
        {
            //return "Room ID: " + roomID + " Room Type: " + s.getRoomType() + " Guest: " + s.getGuest();
            String deleteMessage = "Room ID: " + roomID + "  Room Type: " + s.getRoomType() + "  Guest: " + s.getGuest();


           int response = JOptionPane.showConfirmDialog(null, deleteMessage, "Confirm Delete",
           JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
           if (response == JOptionPane.NO_OPTION) 
           {
           } else if (response == JOptionPane.YES_OPTION) 
           {
           bookings.remove(index);    
           } 
           index++;

        }

    }
    return  "  Cannot find room";
}

это взято из моего класса GUI

else if (item.equals("Cancel Booking"))
    {
        newBookingButton.setEnabled(false);
        cancelBookingButton.setEnabled(false);
        String roomID = JOptionPane.showInputDialog(this, "Enter a room ID", "Delete a Booking", JOptionPane.QUESTION_MESSAGE);
        output.setText(hostel.deleteBooking(roomID));
        newBookingButton.setEnabled(true);
        cancelBookingButton.setEnabled(true);
    }

Любой дополнительный код необходимо либо спросить, либо есть полная копия в ссылке выше, спасибо

Ответы [ 3 ]

2 голосов
/ 07 января 2012

Ваш цикл увеличивает индекс только в том случае, если идентификатор комнаты текущей комнаты равен идентификатору комнаты, которую нужно удалить.Строка

index++;

должна быть вне блока if.

РЕДАКТИРОВАТЬ:

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

Пример использования итератора:

for (Iterator<Booking> it = bookings.iterator(); it.hasNext(); ) {
    Booking b = it.next();
    if (...) {
        it.remove();
    }
}
1 голос
/ 07 января 2012

В основном, когда s.getRoomID().equals(roomID) истинно, ваш блок if выполняется, поэтому независимо от того, каков ответ пользователя, ваш index увеличивается.Итак, сделайте это:

if ( s.getRoomID().equals(roomID))
{
   //your code
}

index++
0 голосов
/ 07 января 2012

Я только что изучил ваш код, и кажется, что вы пытаетесь перебрать коллекцию, а также одновременно изменить значения.С расширенным циклом for такие вещи приводят к ошибкам, поэтому вместо использования расширенного цикла for необходимо использовать обычный цикл for.Поэтому я изменил ваш метод deleteBookings для соответствующего изменения.

 public String deleteBooking(String roomID)
 {
    //for ( Booking s : bookings )
    for (int i = 0; i < bookings.size(); i++)
    {
        Booking s = bookings.get(i);
        if ( s.getRoomID().equals(roomID))
        {
            //return "Room ID: " + roomID + " Room Type: " + s.getRoomType() + " Guest: " + s.getGuest();
            String deleteMessage = "Room ID: " + roomID + "  Room Type: " + s.getRoomType() + "  Guest: " + s.getGuest();

            //int r = JOptionPane.showOptionDialog,null("Are you sure you would like to delete the following \n"
            //+ "deleteMessage",
            //"Delete a booking",
            //JOptionPane.YES_NO_OPTION,
            //JOptionPane.QUESTION_MESSAGE,null,null,null);

            //if (r == JOptionPane.YES_OPTION) {
            //    bookings.remove(index);
            //}
            //if (r == JOptionPane.NO_OPTION){
           //     return "Booking Was Not Canceled";
           // }
           int response = JOptionPane.showConfirmDialog(null, deleteMessage, "Confirm Delete",
           JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
           if (response == JOptionPane.NO_OPTION) 
           {
           } else if (response == JOptionPane.YES_OPTION) 
           {
           //bookings.remove(index);    
           bookings.remove(i);    
           return deleteMessage + " has been DELETED."; /*I did this.*/
           }                               
        }

    }
    return  "  Cannot find room";
}

Более того, после этого

bookings.remove(i);

Вы забыли вернуть что-то вроде

return deleteMessage + " has been DELETED."; /*I did this.*/

Так каквы не смогли вернуть строку при успешном завершении, поэтому она возвращает «Не удается найти место», даже после успешного удаления.Остальной код идеален.Надеюсь, что это может решить ваш запрос.

С уважением

...