package com.cku.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ArrayUtils
{
	public static <T> boolean contains(T[] arr, T object)
	{
		for (int i = 0; i < arr.length; ++i) {
			if (arr[i].equals(object))
				return true;
		}

		return false;
	}
	
	public static <T> int indexOf(T[] arr, T object)
	{
		for (int i = 0; i < arr.length; ++i) {
			if (arr[i].equals(object))
				return i;
		}

		return -1;
	}
	
	public static <T> T firstOrDefault(List<T> list)
	{
		if (list == null || list.size() == 0)
		{
			return null;
		}
		return list.get(0);
	}
	
	/**
	 * 判断数组是否为空
	 * @param array
	 * @return
	 */
	public static boolean isNullOrEmpty(Object[] array)
	{
		if(array == null || array.length == 0)
		{
			return true;
		}
		return false;
	}
	
	/**
	 * 判断两个字符串数组内容是否完全相同
	 * 注：两个数组不能为空
	 * @param array1
	 * @param array2
	 * @return
	 */
	public static boolean equals(String[] array1, String[] array2)
	{
		if(!isNullOrEmpty(array1) && !isNullOrEmpty(array2) && array1.length == array2.length)
		{
			int len = array1.length;
			for(int i = 0 ; i < len ; i ++)
			{
				if(array1[i] == null && array2[i] != null)
				{
					return false;
				}else if(array1[i] != null && array2[i] == null)
				{
					return false;
				}else if(array1[i] != null && array2[i] != null && !array1[i].equals(array2[i]))
				{
					return false;
				}
			}
			return true;
		}
		return false;
	}

	public static String[] splitString(String string, String regex, String[] defValue)
	{
		if (string == null || string.length() == 0)
		{
			return defValue;
		}
		
		return string.split(regex);
	}
	
	private static <T> T[] _removeRepeats(T[] array)
	{
		List<T> list = new ArrayList<T>();
        for (int i = 0; i < array.length; i++) {
            if (!list.contains(array[i])) {//如果list数组不包括num[i]中的值的话，就返回true。
                list.add(array[i]); //在list数组中加入num[i]的值。已经过滤过。
            }
        }
        
        return (T[])list.toArray(array);
	}

	public static String[] splitStringNoRepeat(String string, String regex)
	{
		String[] ret = string.split(regex);		
		return _removeRepeats(ret);
	}
	
	public static String[] splitStringNoRepeat(String string, String regex, String[] defValue)
	{
		String[] ret = defValue;
		if (string != null && string.length() > 0)
		{
			ret = string.split(regex);
		}
		
		return _removeRepeats(ret);
	}
	
	public static <T> List<T> listFromSingle(T obj)
	{
		ArrayList<T> arr = new ArrayList<T>();
		arr.add(obj);
		return arr;
	}

	public static List<Long> parseLong(List<String> list)
	{
		ArrayList<Long> l = new ArrayList<Long>();
		for (Iterator<String> it = list.iterator(); it.hasNext();)
		{
			String s = it.next();
			l.add(Long.parseLong(s));
		}
		
		return l;
	}

	public static Long[] parseLong(String[] list)
	{
		Long[] l = new Long[list.length];
		for (int i = 0; i < list.length; ++i)
		{
			String s = list[i];
			l[i] = Long.parseLong(s);
		}
		
		return l;
	}

	public static Long[] splitLong(String str, String regex, Long[] defValue)
	{
		if (str == null || str.length() == 0)
		{
			return defValue;
		}
		
		String[] strArr = str.split(regex);
		return parseLong(strArr);
	}
	
	public static <T> T[] toArray(List<T> list)
	{
		T[] arr = null;
		return list.toArray(arr);
	}

	public static <T> T[] addUniqueArray(T[] arr, T object)
	{
		ArrayList<T> list = new ArrayList<T>();
		for (int i = 0; i < arr.length; ++i)
		{
			if (arr[i].equals(object))
			{
				return arr;
			}
			
			list.add(arr[i]);
		}
		
		list.add(object);
		return list.toArray(arr);
	}

	public static <T> T[] addUniqueArraySQL(T[] arr, T object)
	{
		ArrayList<T> list = new ArrayList<T>();
		for (int i = 0; i < arr.length; ++i)
		{
			if (arr[i].equals(object) || arr[i].equals("*"))
			{
				return arr;
			}
			
			list.add(arr[i]);
		}
		
		list.add(object);
		return list.toArray(arr);
	}

	public static <T> List<T> fromObject(T obj) {
		ArrayList<T> ar = new ArrayList<T>();
		ar.add(obj);
		return ar;
	}
}
