de.alpharogroup.collections.ListExtensions.java Source code

Java tutorial

Introduction

Here is the source code for de.alpharogroup.collections.ListExtensions.java

Source

/**
 * 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;
    }
}