Javaと情熱のあいだ

カステラとドーナツと珈琲

Bagを実装するサンプル

HashBagを参考にBeanBagを実装。
機能としては、Listに格納されたBeanの指定したメンバを集計するだけです。
材料はこの辺り
org.apache.commons.beanutils
org.apache.commons.collections
org.apache.commons.lang

    /**
     *
     * 実行
     * @throws Exception 例外
     */
    public void execute() throws Exception {
        final List<Hoge> list = new ArrayList<Hoge>();

        while(list.size() < 100) {

            final Hoge hoge = new Hoge();

            hoge.setHoge(String.valueOf(RandomUtils.nextInt(5)));

            list.add(hoge);
        }

        final Bag bag = new BeanBag(list,"hoge");

        for(Object object : bag.uniqueSet()) {
            System.out.println(String.valueOf(object) + ":"
                    + bag.getCount(String.valueOf(object)) + "個");

        }
    }

    /**
     *
     * <HR>
     * <P>
     *  ■モジュール名 <BR>
     * <BLOCKQUOTE>
     *      BeanBag.java <BR>
     * </BLOCKQUOTE>
     * <P>
     *  ■クラス仕様 <BR>
     * <BLOCKQUOTE>
     *      BeanBagクラスはBagの実装クラスです。<BR>
     * </BLOCKQUOTE>
     * <P>
     * <HR>
     * <P>
     */
    public static class BeanBag
        extends AbstractMapBag implements Bag, Serializable  {

        /**
         * シリアル番号
         */
        private static final long serialVersionUID = 5186602832852100419L;

        /**
         *
         * コンストラクタ。
         * @param coll コレクション
         * @param propertyName プロパティ名
         * @throws IllegalAccessException 例外
         * @throws InvocationTargetException 例外
         * @throws NoSuchMethodException 例外
         */
        public BeanBag(Collection coll, String propertyName) throws
IllegalAccessException, InvocationTargetException, NoSuchMethodException {
            this();
            for (final Object object : coll) {
                add(BeanUtils.getProperty(object, propertyName));
            }
        }

        /**
         *
         * デフォルトコンストラクタ
         */
        private BeanBag() {
            super(new HashMap());
        }

        /**
         * Write the bag out using a custom routine.
         */
        private void writeObject(ObjectOutputStream out) throws
IOException {
            out.defaultWriteObject();
            super.doWriteObject(out);
        }

        /**
         * Read the bag in using a custom routine.
         */
        private void readObject(ObjectInputStream in) throws
IOException, ClassNotFoundException {
            in.defaultReadObject();
            super.doReadObject(new HashMap(), in);
        }


    }

    /**
     *
     * <HR>
     * <P>
     *  ■モジュール名 <BR>
     * <BLOCKQUOTE>
     *      Hoge.java <BR>
     * </BLOCKQUOTE>
     * <P>
     *  ■クラス仕様 <BR>
     * <BLOCKQUOTE>
     *      Hogeクラスは確認用クラスです。<BR>
     * </BLOCKQUOTE>
     * <P>
     * <HR>
     * <P>
     */
    public static class Hoge {

        /**
         * 確認用文字列
         */
        private String hoge;

        /**
         *
         * 確認用文字列の取得
         * @return 確認用文字列
         */
        public String getHoge() {
            return hoge;
        }

        /**
         *
         * 確認用文字列の設定。
         * @param hoge 確認用文字列
         */
        public void setHoge(String hoge) {
            this.hoge = hoge;
        }

    }