public static <A> List<Collection<A>> divide(Collection<A> col, int maxDividedNum, int minEleNum) {
        int eleNum;
        if (col.size() <= maxDividedNum * minEleNum) {
            eleNum = minEleNum;
        } else {
            eleNum = (int) Math.ceil((double)col.size() / maxDividedNum);
        }

        ArrayList<Collection<A>> ret = new ArrayList<Collection<A>>(maxDividedNum);
        LinkedList<A> feeder = new LinkedList<A>(col);

        while (!feeder.isEmpty()) {
            ArrayList<A> tempCol = new ArrayList<A>(eleNum);
            for (int i = 0; i < eleNum && !feeder.isEmpty(); i++) {
                tempCol.add(feeder.removeFirst());
            }
            ret.add(tempCol);
        }
        return ret;
    }