package edu.berkeley.nlp.util; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Set; public class Lists { public static <T> ArrayList<T> newList(T... els) { ArrayList<T> l = new ArrayList<T>(els.length); for (int i = 0; i < els.length; i++) { l.add(els[i]); } return l; } public static <T> List<T> concat(List<T> l1, List<T> l2) { List<T> l = new ArrayList<T>(l1.size() + l2.size()); l.addAll(l1); l.addAll(l2); return l; } public static <T> void reverse(List<T> list) { List<T> temp = new ArrayList<T>(list.size()); temp.addAll(list); int len = list.size(); for (int i = 0; i < len; i++) { list.set(i, temp.get(len - i - 1)); } } public static <T> List<T> subList(List<T> list, Set<Integer> indices) { List<T> l = new ArrayList<T>(indices.size()); for (int i : indices) { l.add(list.get(i)); } return l; } public static <T> void set(List<T> list, int index, T element) { int gap = index - list.size() + 1; while (gap-- > 0) { list.add(null); } list.set(index, element); } public static <T extends Comparable<T>> Comparator<List<T>> comparator(T example) { return new Comparator<List<T>>() { public int compare(List<T> o1, List<T> o2) { for (int i = 0; i < o1.size(); i++) { if (i == o2.size()) return 1; T c1 = o1.get(i); T c2 = o2.get(i); int r = c1.compareTo(c2); if (r != 0) return r; } return o2.size() > o1.size() ? -1 : 0; } }; } public static int min(List<Integer> list) { int min = Integer.MAX_VALUE; for (int i : list) { if (i < min) min = i; } return min; } public static int max(List<Integer> list) { int max = Integer.MIN_VALUE; for (int i : list) { if (i > max) max = i; } return max; } public static <T> List<T> truncate(List<T> list, int len) { if (len >= list.size()) return list; // remove reference to old list to save memory List<T> newlist = new ArrayList<T>(list.subList(0, len)); return newlist; } public static double dotProduct(List<Double> v1, List<Double> v2) { double sum = 0; for (int i = 0; i < v1.size(); i++) sum += v1.get(i) * v2.get(i); return sum; } public static <T> List<T> fromArray(T[] array) { List<T> list = new ArrayList<T>(array.length); for (int i=0; i<array.length; i++) { list.add(array[i]); } return list; } public static int[] toPrimitiveArray(List<Integer> curList) { int[] newArray = new int[curList.size()]; for(int i=0; i < newArray.length; i++) { newArray[i] = curList.get(i); } return newArray; } public static double[] toPrimitiveArray(List<Double> curList) { double[] newArray = new double[curList.size()]; for(int i=0; i < newArray.length; i++) { newArray[i] = curList.get(i); } return newArray; } /** * Like Python */ public static List<Integer> rangeList(int i, int j) { List<Integer> l = new ArrayList<Integer>(j - i); for (int k = i; k < j; k++) { l.add(k); } return l; } }