001    /*
002     * $Id: ListUtil.java 3049 2010-03-20 15:08:52Z kredel $
003     */
004    
005    package edu.jas.util;
006    
007    import java.util.List;
008    import java.util.ArrayList;
009    import java.util.LinkedList;
010    
011    import org.apache.log4j.Logger;
012    
013    import edu.jas.structure.Element;
014    import edu.jas.structure.UnaryFunctor;
015    
016    
017    /**
018     * List utilities.
019     * For example map functor on list elements.
020     * @author Heinz Kredel
021     */
022    
023    public class ListUtil {
024    
025    
026        private static final Logger logger = Logger.getLogger(ListUtil.class);
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>>
036               List<D> map(List<C> list, UnaryFunctor<C,D> f) {
037            if ( list == null ) {
038                return (List<D>)null;
039            }
040            List<D> nl;
041            if ( list instanceof ArrayList ) {
042                nl = new ArrayList<D>( list.size() );
043            } else if ( list instanceof LinkedList ) {
044                nl = new LinkedList<D>();
045            } else {
046                throw new RuntimeException("list type not implemented");
047            }
048            for ( C c : list ) {
049                D n = f.eval( c );
050                nl.add( n );
051            }
052            return nl;
053        }
054    
055    
056        /**
057         * Tuple from lists.
058         * @param A list of lists.
059         * @return new list with tuples (a_1,...,an) with ai in Ai, 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    }