001/* 002 * $Id: ListUtil.java 5040 2014-12-29 11:31:34Z 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 093 094 /** 095 * Create a list of given length and content. 096 * @param n length of new list 097 * @param e object to be filled in 098 * @return list (e, ..., e) of length n 099 */ 100 public static <C> List<C> fill(int n, C e) { 101 List<C> r = new ArrayList<C>(n); 102 for (int m = 0; m < n; m++) { 103 r.add(e); 104 } 105 return r; 106 } 107 108}