2017-08-21 16 views
0

私はこのサイトを初めて利用していますので、私の質問や質問のスタイルについて何か間違っている場合は、私を修正してください。反復可能な手のサイズが間違っている

私はこのクラスのすべての共有を繰り返し処理できるように、私のShareCollectionクラスでIterableインターフェイスを実装する必要があります。サンプルデータでクラスをテストするとき、私のコレクションに2つのシェアがありますが(たとえ私の例では)、常にサイズとして「0」が返されます。

は、ここでその手の甲エラークラス+ 1つのサンプルメソッドのコードです:

public class ShareCollection implements Iterable<Share>{ 
    private HashSet<Share> shares; 

    public ShareCollection() { 
     this.shares = new HashSet<Share>(); 
    } 

    public ShareCollection(Collection<Share> shares) { 
     for (Share s : shares) { 
      HashSet<Share> checkSet = new HashSet<Share>(shares); 
      checkSet.remove(s); 
      if (checkSet.contains(s)) { 
       throw new IllegalArgumentException("There can't be two shares with the same name!"); 
      } 
     } 
     this.shares = new HashSet<Share>(shares); 
    } 

    public boolean add(Share share) { 
     if (share == null) { 
      throw new NullPointerException("share isnt allowed to be null!"); 
     } 
     return shares.add(share); 
    } 


    @Override 
    public Iterator<Share> iterator() { 
     return new HashSet<Share>(shares).iterator(); 
    } 
} 

はここで私が使用しているサンプルデータとの主な方法です:

public static void main(String[] args) { 
    Share s1 = new Share("s1", new ArrayList<>()); 
    Share s2 = new Share("s2", new ArrayList<>()); 

    ShareCollection sc = new ShareCollection() 
    sc.add(s1); 
    sc.add(s2); 

    int counter = 0; 

    for (Share s : sc) { 
     counter++; 
    } 

    System.out.print("Counter: " + counter + "\n"); 
    System.out.print("Size: " + sc.size()); 

} 

メインメソッドの出力は次のとおりです。

Counter: 2 
Size: 0 

はここにadd'・メソッドのエラーです:

java.lang.AssertionError: ShareCollection#size should give 1 for a collection with 1 elements. 
Expected: <1> 
    but: was <0> 
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20) 
    at org.junit.Assert.assertThat(Assert.java:956) 
    at jpp.marketanalysis.tests.data.TestShareCollection.hasElements(TestShareCollection.java:158) 
    at jpp.marketanalysis.tests.data.TestShareCollection.testAdd(TestShareCollection.java:55) 

は、あなたの答えのために事前にありがとうございます!

更新:

  • はHashSetの(SeanPatrickFloydの最初の答え@参照)とのArrayListを交わし
+0

テストコード –

+0

あなたが投稿なし 'サイズコードで()'メソッドはありませんを共有してください! – msandiford

+0

@msandiford私はあなたが何を意味するのか正確には分かっていませんが、メインメソッドの最終行の 'sc。サイズ() - 私はサイズ()を使用する - –

答えて

0

可能性のあるエラー:あなたの共有クラスが.equals()メソッドをオーバーライドしていますか?

  • アンのArrayList()は、ルックアップ(O(n))を.containsで非常に悪いです。また.equals()

    ArrayList.contains()ため代表団は、私はあなたのコードを有する少なくとも2つの問題を参照してください。代わりにHashSetを使用する必要があります(この場合、Shareクラスの.equals().hashCode()をオーバーライドする必要があります)。O(1)を与え、.add()メソッドも適切に処理します。

  • あなたが返すイテレータは、反復中に何かを追加するとConcurrentModificationExceptionなどのいくつかの方法でコードを脆弱にするArrayListの元のイテレータですが、イテレータで.remove()を呼び出した場合は突然変異もあります。コレクションの防御的なコピーを作成し、そのイテレータを使用することをお勧めします。

ここにあなたのコードは、それに応じて書き換えられます:

public class ShareCollection implements Iterable<Share>{ 
    private final Set<Share> shares; 

    public ShareCollection() { 
     this.shares = new HashSet<>(); 
    } 

    public ShareCollection(Collection<Share> shares) { 
     this.shares = new HashSet<>(shares); 
    } 

    public boolean add(Share share) { 
     if (share == null) { 
      throw new NullPointerException("share isnt allowed to be null!"); 
     } 
     return shares.add(share); 
    } 


    @Override 
    public Iterator<Share> iterator() { 
     return new HashSet<>(shares).iterator(); 
    } 
} 
+0

ありがとうございました!はい、ShareクラスのequalsとhashCodeを生成し、両方をオーバーロードしました。私はあなたの懸念を理解し、リストをHashSetに変更しましたが、残念ながらこれはエラーを修正しません。 –

+0

@ T.Moもう一度、テストが失敗する可能性があります –

+0

本当にこの可能性がありますが、私はそれを疑うことがあります。まあ、私はそれを動作させるために何かを試しているだけかもしれない、多分私は幸運であり、試行錯誤でエラーを修正します。 –

関連する問題