001/*
002 * $Id: ListUtil.java 4065 2012-07-27 15:17:38Z kredel $
003 */
004
005package edu.jas.util;
006
007
008import java.util.ArrayList;
009import java.util.LinkedList;
010import java.util.List;
011
012import edu.jas.structure.Element;
013import edu.jas.structure.UnaryFunctor;
014
015
016/**
017 * List utilities. For example map functor on list elements.
018 * @author Heinz Kredel
019 */
020
021public class ListUtil {
022
023
024    //private static final Logger logger = Logger.getLogger(ListUtil.class);
025
026
027    // private static boolean debug = logger.isDebugEnabled();
028
029
030    /**
031     * Map a unary function to the list.
032     * @param f evaluation functor.
033     * @return new list elements f(list(i)).
034     */
035    public static <C extends Element<C>, D extends Element<D>> List<D> map(List<C> list, UnaryFunctor<C, D> f) {
036        if (list == null) {
037            return null;
038        }
039        List<D> nl;
040        if (list instanceof ArrayList) {
041            nl = new ArrayList<D>(list.size());
042        } else if (list instanceof LinkedList) {
043            nl = new LinkedList<D>();
044        } else {
045            throw new RuntimeException("list type not implemented");
046        }
047        for (C c : list) {
048            D n = f.eval(c);
049            nl.add(n);
050        }
051        return nl;
052    }
053
054
055    /**
056     * Tuple from lists.
057     * @param A list of lists.
058     * @return new list with tuples (a_1,...,an) with ai in Ai,
059     *         i=0,...,length(A)-1.
060     */
061    public static <C> List<List<C>> tupleFromList(List<List<C>> A) {
062        if (A == null) {
063            return null;
064        }
065        List<List<C>> T = new ArrayList<List<C>>(A.size());
066        if (A.size() == 0) {
067            return T;
068        }
069        if (A.size() == 1) {
070            List<C> Ap = A.get(0);
071            for (C a : Ap) {
072                List<C> Tp = new ArrayList<C>(1);
073                Tp.add(a);
074                T.add(Tp);
075            }
076            return T;
077        }
078        List<List<C>> Ap = new ArrayList<List<C>>(A);
079        List<C> f = Ap.remove(0);
080        List<List<C>> Tp = tupleFromList(Ap);
081        //System.out.println("Tp = " + Tp);
082        for (C a : f) {
083            for (List<C> tp : Tp) {
084                List<C> ts = new ArrayList<C>();
085                ts.add(a);
086                ts.addAll(tp);
087                T.add(ts);
088            }
089        }
090        return T;
091    }
092}