溫暖潔森

          勇敢做自己

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            13 隨筆 :: 1 文章 :: 70 評論 :: 0 Trackbacks
          最近使用apache的commons-collections組件進行集合的操作,程序需要用到CollectionUtils類對集合進行刪除操作,
          具體如下:

          有兩個集合Collection a,Collection b,需要把b中與a中集合元素相同的剔除掉,只留下在a集合中不包含b的元素,測試方法如下:

          @Test
           public void testCollectionRemove() {
            ArrayList<String> list = new ArrayList<String>();
            list.add("11");
            list.add("22");
            list.add("33");
            list.add("44");

            ArrayList<String> list1 = new ArrayList<String>();
            list1.add("22");
            list1.add("44");
            list1.add("55");
            Collection c = CollectionUtils.removeAll(list, list1);
            assertEquals(true, ((List) c).contains("11"));
            assertEquals(true, ((List) c).contains("33"));
            assertEquals(false, ((List) c).contains("22"));
            assertEquals(false, ((List) c).contains("44"));

           }


          java.lang.AssertionError: expected:<true> but was:<false>
           at org.junit.Assert.fail(Assert.java:74)
           at org.junit.Assert.failNotEquals(Assert.java:448)
           at org.junit.Assert.assertEquals(Assert.java:102)
           at org.junit.Assert.assertEquals(Assert.java:117)
           at com.gresoft.components.TestCommonsCollection.testCollectionRemove(TestCommonsCollection.java:90)
           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
           at java.lang.reflect.Method.invoke(Method.java:585)
           at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
           at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
           at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
           at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87)
           at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77)
           at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
           at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88)
           at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
           at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
           at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:26)
           at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:36)
           at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
           at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
           at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
           at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
           at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
           at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
           at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

           


          在第一個assertEquals中junit抱應該是false,實際應該是true,查看源碼發現:

           public static Collection removeAll(Collection collection, Collection remove)
              {
                  return ListUtils.retainAll(collection, remove);
              }

           public static List retainAll(Collection collection, Collection retain)
              {
                  List list = new ArrayList(Math.min(collection.size(), retain.size()));
                  for(Iterator iter = collection.iterator(); iter.hasNext();)
                  {
                      Object obj = iter.next();
                      if(retain.contains(obj))
                          list.add(obj);
                  }

                  return list;
              }

          上面紅色字體是兩個集合有相同元素的留下,而不是不相同的留下。這個應該改成if(!retain.contains(obj))


          后來發現
          CollectionUtils.removeAll(list, list1);和CollectionUtils.retainAll(list, list1);功能是一樣的,所以這跟它文檔是不符合的,大家在使用時候注意!

          posted on 2008-01-03 12:09 harry520 閱讀(1985) 評論(0)  編輯  收藏 所屬分類: J2EE
          主站蜘蛛池模板: 湛江市| 广饶县| 都兰县| 咸宁市| 南郑县| 翼城县| 神木县| 宜丰县| 迭部县| 新郑市| 普宁市| 迁安市| 怀集县| 海淀区| 武乡县| 阳信县| 会昌县| 修水县| 乐至县| 岑溪市| 宜州市| 衢州市| 乌兰浩特市| 六盘水市| 房产| 黑河市| 汽车| 钟山县| 玉龙| 惠东县| 刚察县| 简阳市| 安国市| 冷水江市| 翼城县| 阳城县| 新巴尔虎右旗| 通道| 阜城县| 奈曼旗| 定襄县|