/* Copyright (C) 2003 Univ. of Massachusetts Amherst, Computer Science Dept.
This file is part of "MALLET" (MAchine Learning for LanguagE Toolkit).
http://www.cs.umass.edu/~mccallum/mallet
This software is provided under the terms of the Common Public License,
version 1.0, as published by http://www.opensource.org. For further
information, see the file `LICENSE' included with this distribution. */
package cc.mallet.util;
import gnu.trove.THashSet;
import gnu.trove.TObjectDoubleHashMap;
import gnu.trove.TObjectDoubleProcedure;
import java.util.*;
/**
* *
* Created: Sun Jan 25 01:04:29 2004
*
* @author <a href="mailto:casutton@cs.umass.edu">Charles Sutton</a>
* @version $Id: CollectionUtils.java,v 1.1 2007/10/22 21:37:40 mccallum Exp $
*/
public class CollectionUtils {
private CollectionUtils() {} // No instances
public static String dumpToString (Collection c, String separator)
{
String retval = "";
for (Iterator it = c.iterator(); it.hasNext();) {
retval += String.valueOf(it.next());
retval += separator;
}
return retval;
}
public static String dumpToString (Collection c)
{
return dumpToString (c, " ");
}
public static void print (Collection c)
{
System.out.println (dumpToString (c));
}
public static void print (Collection c, String separator)
{
System.out.println (dumpToString (c, separator));
}
public static Collection subset (Collection c, int size, java.util.Random rand)
{
ArrayList list = new ArrayList (c);
int realSize = (size < c.size()) ? size : c.size();
java.util.Collections.shuffle (list, rand);
return list.subList (0, realSize);
}
public static List sortedUnion (List args1, List args2)
{
SortedSet set = new TreeSet ();
set.addAll (args1);
set.addAll (args2);
List lst = new ArrayList (set.size ());
for (Iterator it = set.iterator (); it.hasNext ();) {
Object o = it.next ();
lst.add (o);
}
return lst;
}
/** Computes a nondestructive intersection of two collections. */
public static Collection intersection (Collection c1, Collection c2)
{
Set set = new THashSet (c1);
set.retainAll (c2);
return set;
}
public static Collection union (Collection c1, Collection c2)
{
Set set = new THashSet (c1);
set.addAll (c2);
return set;
}
/** Returns the key in map that has the greatest score */
public static Object argmax (TObjectDoubleHashMap map)
{
// A local class! Yes, Virginia, this is legal Java.
class Accumulator implements TObjectDoubleProcedure {
double bestVal = Double.NEGATIVE_INFINITY;
Object bestObj = null;
public boolean execute (Object a, double b)
{
if (b > bestVal) {
bestVal = b;
bestObj = a;
}
return true;
}
}
Accumulator procedure = new Accumulator ();
map.forEachEntry (procedure);
return procedure.bestObj;
}
public static interface Fn { Object f (Object input); }
/** Returns a new collection whose elements consist of the function fn.f applied to all of the
* elements of the given collection. The returned collection will have the same class as the input
* collection.
*/
public static Collection map (Collection c, Fn fn)
{
Class collectionClass = c.getClass ();
Collection copy;
try {
copy = (Collection) collectionClass.newInstance ();
} catch (InstantiationException e) {
throw new RuntimeException (e); // should never happen; collections always have public default ctor
} catch (IllegalAccessException e) {
throw new RuntimeException (e); // should never happen; collections always have public default ctor
}
Iterator it = c.iterator ();
while (it.hasNext ()) {
copy.add (fn.f (it.next ()));
}
return copy;
}
} // Collections