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 }