2012-01-07 10 views
2

検索の削除予約などを追加するプログラムを作成しています... 時間が経過した後、私は進歩していると思っていましたが、予約を削除すると、その予約の正しい情報が返されますが、別の予約が削除されます。アレイリストからデータの文字列を削除する

私はzip形式でファイルを添付していますが、表示されているように画面のスペースが大きくなります。プログラムはBlueJayで作られていますdeclerationため hostelgreamenew.zip 18.4 KB

コードとこれはこれはから取られ

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"; 
} 

私のホステルのクラスから取得され

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; 
} 

私の配列リストにオブジェクトを追加します私の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); 
    } 

任意のコードn尋ねるか、上記のリンクに完全なコピーがあります。

+5

ここにだれがZIPファイルをダウンロードし、ソースコードのすべてを読んでするつもりはありません。問題を説明する**最小**のテストケースを作成してください(http://sscce.orgを参照)。 –

+1

修正されたリビジョンコードが表示されました –

+0

@HxMGraeme:プログラムの開始点を教えてください。それでおしまい 。よろしくお願いします。 –

答えて

2

ループは、現在のルームのルームIDが削除するルームのIDと等しい場合にのみインデックスをインクリメントします。線

index++; 

ifブロックの外にある必要があります。

EDIT:

他の問題は、あなたがそれを反復しながら、要素にコレクションを削除しようとしているということです。これは、イテレータを使用してコレクションを反復し、イテレータのremoveメソッドを使用して現在の要素を削除する場合にのみ可能です。可能であれば、指定されたインデックスで要素を削除するので、このインデックスで要素を削除しただけなので、インデックスを増やすべきではありません。イテレータを使用しての

例:s.getRoomID().equals(roomID)がtrueの場合

for (Iterator<Booking> it = bookings.iterator(); it.hasNext();) { 
    Booking b = it.next(); 
    if (...) { 
     it.remove(); 
    } 
} 
+0

私は、インデックスを取る+ +; 〜に}私は、削除の確認を押して、プログラム全体がエラーhenseと私はそれを上に移動して浸水して取得します。私は何が間違っていたかわからない –

+0

私の編集を参照してください。それが問題を解決することを望むランダムな動きを試すことは、通常、良い戦略ではありません。あなたのアルゴリズムが何をしているのか考えてみてください。 –

+0

私のプログラムのためにそれを使うことができるかどうかを見てくれてありがとう。ちょうど時間がなくなりました –

1

基本的にはあなたのifブロックがそのように関係なく、あなたのindexがインクリメントされ、ユーザの応答が何であるか実行されません。だから、次の操作を行います。

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

index++ 
+0

Ivはifステートメントの外側でインデックス++を取っていましたが、bookins.remove(index)を確認するためにokを押すと、今度はdiffernceを作成したようです。アプリケーションは、エラーコードの多くの赤い線で任意のアイデアを持つウィンドウを示していますか?ありがとう –

0

は、私は自分のコードに見て、あなたは、コレクションを反復処理しようとすると同時に値を変更しているように思えます。拡張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.*/ 

のようなものを返すのを忘れて、それが「それは返す理由だことはできません「部屋を見つける」ことができます。 コードの残りの部分は完璧です。 質問を解決する可能性があります。

よろしく

関連する問題