/** * The MIT License * * Copyright (C) 2007 Asterios Raptis * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package de.alpharogroup.collections; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.Vector; import org.apache.commons.beanutils.BeanComparator; import org.apache.commons.collections4.ComparatorUtils; import de.alpharogroup.collections.modifications.ModifiedCollections; import de.alpharogroup.comparators.ComparableComparator; /** * Extensions class for use with List objects. * * @author Asterios Raptis * @version 1.0 */ public class ListExtensions { /** * This Method look in the List toSearch if at least one Object exists in the List search. * * @param <T> * the generic type * @param toSearch * The List to search. * @param search * The List to inspect. * @return Returns true if there is at least one Object equal from the two List otherwise false. */ public static <T> boolean containAtleastOneObject(final List<T> toSearch, final List<T> search) { boolean contains = false; final int size = toSearch.size(); for (int i = 0; i < size; i++) { contains = search.contains(toSearch.get(i)); if (contains) { break; } } return contains; } /** * Gets the first object from the given List. * * @param <T> * the generic type * @param list * the List. * @return Returns the first object from the given List or null if the List is empty or null. */ public static <T> T getFirst(final List<T> list) { if (list != null && !list.isEmpty()) { return list.get(0); } return null; } /** * Gets the last object from the given List. * * @param <T> * the generic type * @param list * the List. * @return Returns the last object from the given List or null if the List is empty or null. */ public static <T> T getLast(final List<T> list) { if (!isEmpty(list) && 0 < list.size()) { return list.get(list.size() - 1); } return null; } /** * Gets the modified lists. finding from an old list which elements have been removed and which * have been added. * * @param <T> * the generic type * @param previous * the previous collection i.e. the collection from database. * @param next * the next collection i.e. the current collection in the view. * @return 's the ModifiedLists in which the lists are keeped. */ public static <T> ModifiedCollections<T> getModifiedCollections(final Collection<T> previous, final Collection<T> next) { return new ModifiedCollections<T>().getModifiedLists(previous, next); } /** * The Method looks at both List and if they have same objects they are added to one List and * will returns the result. * * @param <T> * the generic type * @param toSearch * The List to search. * @param search * The List to inspect. * @return The List with the same objects. */ public static <T> List<T> getSameElementsFromLists(final List<T> toSearch, final List<T> search) { List<T> foundElements = null; final int size = toSearch.size(); for (int i = 0; i < size; i++) { final T element = toSearch.get(i); if (search.contains(element)) { if (foundElements == null) { foundElements = new ArrayList<>(); } foundElements.add(element); } } return foundElements; } /** * Checks if a List is null or empty. * * @param <T> * the generic type * @param list * The List to check. * @return true if the list is null or empty otherwise false. */ public static <T> boolean isEmpty(final List<T> list) { return list == null || list.isEmpty(); } /** * Checks if the given List is not null or empty. * * @param <T> * the generic type * @param list * The List to check. * @return true if the list is null or empty otherwise false. */ public static <T> boolean isNotEmpty(final List<T> list) { return list != null && !list.isEmpty(); } /** * Creates a new {@link Integer} array with the given range that is defined through start and * end. For instance if the start is 5 and the end is 9 the resulted array will be [5,6,7,8,9] * * @param start * The number to start * @param end * The number to end minus one * @return the generated {@link Integer} array */ public static Integer[] newRangeArray(final int start, final int end) { if (end < start) { throw new IllegalArgumentException( "Parameter end should be greater than parameter start."); } final int length = end - start + 1; final Integer[] array = new Integer[length]; for (int i = start; i <= end; i++) { array[i - start] = i; } return array; } /** * Creates a new {@link Integer} {@link List} with the given range that is defined through start * and end. For instance if the start is 5 and the end is 9 the resulted {@link List} will be * [5,6,7,8,9] * * @param start * The number to start * @param end * The number to end minus one * @return the generated {@link Integer} List */ public static List<Integer> newRangeList(final int start, final int end) { return Arrays.asList(newRangeArray(start, end)); } /** * Helper-Method for printing a Collection in the console. * * @param <T> * the generic type * @param collection * The Collection to print. */ public static <T> void printCollection(final Collection<T> collection) { int count = 1; for (final T element : collection) { System.err.println(count + ".)element:" + element); count++; } } /** * Removes the first object from the given List. * * @param <T> * the generic type * @param list * the List. * @return Removes and returns the first object from the given List or null if the List is empty * or null. */ public static <T> T removeFirst(final List<T> list) { if (!isEmpty(list) && 0 < list.size()) { return list.remove(0); } return null; } /** * Removes the last object from the given List. * * @param <T> * the generic type * @param list * the List. * @return Removes and returns the last object from the given List or null if the List is empty * or null. */ public static <T> T removeLast(final List<T> list) { if (!isEmpty(list) && 0 < list.size()) { return list.remove(list.size() - 1); } return null; } /** * The Method removeLastValues(ArrayList, int) remove the last Values. * * @param <T> * the generic type * @param v * The Vector with the received Messages. * @param remove * How much to remove. * @return the list */ public static <T> List<T> removeLastValues(final ArrayList<T> v, final int remove) { if (remove < v.size()) { final List<T> l = v.subList(remove, v.size()); return l; } throw new IllegalArgumentException("You cannot remove " + "more element than in the ArrayList exists. \nSize from ArrayList:" + v.size() + "\n" + "Elements to be removed:" + remove + "\n The same ArrayList will be returned."); } /** * Reverts the order from the given List. * * @param <T> * the generic type * @param listToRevert * The List to revert. * @return The reverted List. */ public static <T> List<T> revertOrder(final List<T> listToRevert) { final List<T> revertedList = new ArrayList<>(); int size = listToRevert.size(); while (0 < size) { revertedList.add(listToRevert.get(--size)); } return revertedList; } /** * Shuffle selected elements in the source list to the destination list from the given indexes * in the array selectedElements. * * @param <T> * the generic type * @param source * the source * @param destination * the destination * @param selectedElements * the selected elements */ public static <T> void shuffle(final List<T> source, final List<T> destination, final int[] selectedElements) { final int lastIndex = selectedElements.length - 1; for (int i = lastIndex; -1 < i; i--) { final int selectedRow = selectedElements[i]; final T row = source.remove(selectedRow); destination.add(row); } } /** * Sort over the given property. Note: the property should be implement the Comparable * interface. * * @param <T> * the generic type of the list * @param list * the list to sort. * @param property * the property to sort. * @param ascending * if true the sort will be ascending ohterwise descending. */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static <T> void sortByProperty(final List<T> list, final String property, final boolean ascending) { Comparator comparator = new BeanComparator(property, new ComparableComparator()); if (ascending) { comparator = ComparatorUtils.reversedComparator(comparator); } Collections.sort(list, comparator); } /** * Splits the List to Parts to the specified times. * * @param <T> * the generic type * @param list * The List to Split * @param times * How to split. * @return An List with the Splitted Parts */ public static <T> List<List<T>> splitListToParts(final List<T> list, final int times) { final List<List<T>> returnList = new ArrayList<>(); List<T> tmp = new ArrayList<>(); final Iterator<T> it = list.iterator(); int count = 0; while (it.hasNext()) { if (count == times) { returnList.add(tmp); tmp = new ArrayList<>(); tmp.add(it.next()); count = 1; } else { tmp.add(it.next()); count++; } } if (!tmp.isEmpty()) { returnList.add(tmp); } return returnList; } /** * Splits the Set to Parts to the specified times. * * @param <T> * the generic type * @param set * The Set to Split * @param times * How to split. * @return An ArrayList with the Splitted Parts */ public static <T> List<List<T>> splitSetToParts(final Set<T> set, final int times) { final List<List<T>> returnList = new ArrayList<>(); ArrayList<T> tmp = new ArrayList<>(); final Iterator<T> it = set.iterator(); int count = 0; while (it.hasNext()) { if (count == times) { returnList.add(tmp); tmp = new ArrayList<>(); tmp.add(it.next()); count = 1; } else { tmp.add(it.next()); count++; } } if (!tmp.isEmpty()) { returnList.add(tmp); } return returnList; } /** * Converts the given parameters to an object array. * * @param <T> * the generic type * @param t * The objects that will be in the returned object array * * @return An Object array. */ @SafeVarargs public static <T> Object[] toObjectArray(final T... t) { final Object[] decorator = new Object[t.length]; System.arraycopy(t, 0, decorator, 0, t.length); return decorator; } /** * Converts the given enumaration to a Vector. * * @param <T> * the generic type * @param enumaration * The Enumeration to convert. * * @return A new Vector with the content of the given Enumeration. */ public static <T> Vector<T> toVector(final Enumeration<T> enumaration) { final Vector<T> vector = new Vector<T>(); while (enumaration.hasMoreElements()) { vector.add(enumaration.nextElement()); } return vector; } }