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 }