2016-04-10 18 views
-5

を含み、真/偽のブール値を実行する手助けが必要です。このように私のブールセットアップ:は、今私が持っているため、ループや条件

public boolean deleteItem(String p) { 
    for(int i = this.myList.size() - 1; i > -1; i--) { 
     if(this.myList.get(i) == p) { 
      this.myList.remove(i); 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

私はArrayListを通過し、文字列pを削除しようとしています文字列pがarraylist内に存在する場合、文字列を削除してtrueを返す必要があります。存在しない場合は、単にfalseを返す必要があります。私は今すぐeclipseでコーディングしています。私が今持っているリターンステートメントは、必要な "リターンステートメント"として数えられないと言います。正しい場所にreturn文があるようにコードを修正するにはどうすればよいですか?

+2

elseブロックを削除し、forループの外側で 'return false;'を移動します。 –

+2

@ Johnが言ったことと、 '.equals()'を使って文字列を比較します( '=='ではなく)。 – Bohemian

+2

*デバッガ*を使用してください。私たちはあなたのデバッガーではありません。コードを実行すると、すぐにエラーが表示されます。 – Andreas

答えて

0

あなたは何も返されないコードを通る経路を持っています。あなたのリストが空の場合、ループは実行されず、何も流れません。また、最初のアイテムをtrueまたはfalseで処理すると、ループが返されます。

Johnによるコメントは正しいです。

「他のブロックを削除し、forループの外return false;を移動します。

1

なぜ車輪の再発明?

public boolean deleteItem(String p) { 
    return this.list.remove(p); 
} 
0

あなたの機能は、欠陥の数を持っています。

  1. あなたがやっています値の等価性チェックではなく、常にequalsメソッドを使用します。この種の欠陥に対してコンパイラエラーは発生しません。望ましくない出力。
  2. メソッド署名がvoidでないreturn文を示していても、関数内のすべてのコントロールフローにreturn文があるわけではありません。これにより、コンパイルエラーが発生します。これは、コード内に表示されているエラーです。
  3. 複数のリターンステートメントがあります。これはコンパイラエラーでもランタイムエラーでもありません。しかし、良いプログラミング実践の観点からは、複数のreturn文を持つことは最善の考えではありません。最後にフラグベースのreturn文を実行できます。
  4. コレクションオブジェクトから反復処理中に要素を削除しています。使用しているコレクション・オブジェクトのタイプによっては、実行時にConcurrentModificationException例外がスローされることがあります。可能であれば、フェールセーフイテレータを使用する必要があります。

あなたのプログラムを修正しようとしました。

public boolean deleteItem(String p) { 
    boolean itemFound = false; 
    //Assuming your myList object returns a fail safe iterator. 
    //If it returns a fail fast iterator instead, see the next option.  
    Iterator<String> iter = this.myList.iterator(); 
    while(iter.hasNext()){ 
     if(iter.next().equals(p)) { 
      iter.remove(); 
      itemFound=true; 
     } 
    } 
    return itemFound; 
} 

イテレータがフェールセーフであれば、上記のプログラムは動作します。例えば。 myListオブジェクトの型がCopyOnWriteArrayListの場合、イテレータはフェイルセーフになります。しかし、あなたのmyListオブジェクトがそのような単純なArrayListのような型のものであれば、フェイル・ファスト・イテレータを返します。上記のメソッドはCMEを提供します。

あなたはmyListコレクションオブジェクトは、タイプリストの場合は、同じように簡単な何か試すことができます:あなたは、Java 8を使用している場合は、次のような何かを行うことができ、

public boolean deleteItem(String p) { 
    //removeAll will return true if at least 1 element is removed 
    return this.myList.removeAll(Collections.singletonList(p)); 
} 

代わりに:

public boolean deleteItem(String p) { 
    //removeIf will return true if at least 1 element is removed 
    return this.myList.removeIf(item -> item != null && item.equals(p)); 
} 

これはあなたに少し役立ちますように願っています。

関連する問題