0

(指定された Comparator に基づいて) 同じオブジェクトの複数のインスタンスを追加できる Collection インターフェイスを実装するものを探していましたが、コレクションには同じオブジェクト ID を 2 回含めることはできません (== 演算子に基づいて)。コレクションはソートする必要があり、(== 演算子に基づいて) 1 つの特定の要素を削除できる必要があります。

つまり、次のテストケースを満たす必要があります。

public MyCollection<E> implements Collection<E>
{ ... }

public class MyCollectionTest extends TestCase
{
   static class MyComparator implements Comparator<MyInterface>
   {
      @Override
      public int compare(MyInterface pO1, MyInterface pO2)
      {
         // the return type of getCategory() is just an enum.
         return pO1.getCategory().ordinal() - pO2.getCategory().ordinal();
      }
   }

   public void testAdd()
   {
      MyCollection<MyInterface> sut = new MyCollection<MyInterface>(new MyComparator());
      MyInterface svc1 = EasyMock.createNiceMock(MyInterface.class);
      MyInterface svc2 = EasyMock.createNiceMock(MyInterface.class);
      EasyMock.expect(svc1.getCategory()).andStubReturn(Category.CAR);
      EasyMock.expect(svc2.getCategory()).andStubReturn(Category.VAN);
      EasyMock.replay(svc1, svc2);
      sut.add(svc1);
      sut.add(svc2);
      assertEquals(2, sut.size());
      assertSame(svc1, sut.last());
      assertSame(svc2, sut.first());
   }

   public void testAddDouble()
   {
      MyCollection<MyInterface> sut = new MyCollection<MyInterface>(new MyComparator());
      MyInterface svc1 = EasyMock.createNiceMock(MyInterface.class);
      EasyMock.expect(svc1.getCategory()).andStubReturn(Category.CAR);
      sut.add(svc1);
      sut.add(svc1);
      assertEquals(1, sut.size());
   }

   public void testRemove()
   {
      MyCollection<MyInterface> sut = new MyCollection<MyInterface>(new MyComparator());
      MyInterface svc1 = EasyMock.createNiceMock(MyInterface.class);
      MyInterface svc2 = EasyMock.createNiceMock(MyInterface.class);
      EasyMock.expect(svc1.getCategory()).andStubReturn(Category.VAN);
      EasyMock.expect(svc2.getCategory()).andStubReturn(Category.VAN);
      EasyMock.replay(svc1, svc2);
      sut.add(svc1);
      sut.add(svc2);
      assertEquals(2, sut.size());
      sut.remove(svc1);
      assertEquals(1, sut.size());
   }
}

助けはありますか?

ありがとうございました!

4

3 に答える 3

1

既存のコレクションが希望どおりに機能しない場合は、次の戦略を検討してください。

public メソッドがまさに必要なことを行うクラスを定義します。

忙しい作業を処理するために既存のコレクションを使用してクラスを実装しますが、要件を課すためにコードを制御します。

たとえば、クラスに TreeSet があり、その各要素が基になるクラスの空でない IdentityHashMap である場合があります。TreeSet コンパレータは、各 IdentityHashMap から要素を取得し、それらを比較した結果を返します。

要素を削除するには、最初にそれを削除するとその IdentityHashMap が空になるかどうかを確認します (存在し、設定サイズは 1 です)。その場合は、TreeSet から IdentityHashMap を削除します。そうでない場合は、IdentityHashMap から要素を削除します。

これは単なる概要であり、多くの詳細を記入する必要があります。要点は、記述したクラスに既にラップされているものに基づいて、必要なものを正確に構築するという考えです。

于 2013-08-30T14:35:12.573 に答える
0

あなたの質問のこの部分に関して、「しかし、コレクションには同じオブジェクトIDを2回含めることはできません(演算子に基づいて==)」、2つのオブジェクトをequalsと演算子の両方で等しくしたい場合は、==インスタンス制御オブジェクト(基本的にオブジェクト)について読む必要があります独自のインスタンスをハッシュし、要求されたオブジェクトが既に存在する場合、新しいオブジェクトを作成する代わりに、キャッシュされた同じオブジェクトを返します)。

于 2013-08-30T13:55:47.057 に答える