1、设置数组默认值方法
public static void Fill(byte[] array,byte defaultValue)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = defaultValue;
}
}
public static void Fill(char[] array, char defaultValue)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = defaultValue;
}
}
public static void Fill<T>(T[] array, T defaultValue)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = defaultValue;
}
}
public static void Fill(byte[] a, int fromIndex, int toIndex, byte val)
{
RangeCheck(a.Length, fromIndex, toIndex);
for (int i = fromIndex; i < toIndex; i++)
a[i] = val;
}
private static void RangeCheck(int length, int fromIndex, int toIndex)
{
if (fromIndex > toIndex)
{
throw new ArgumentException(
"fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")");
}
if (fromIndex < 0)
{
throw new IndexOutOfRangeException("fromIndex(" + fromIndex + ")");
}
if (toIndex > length)
{
throw new IndexOutOfRangeException( "toIndex(" + toIndex + ")");
}
}
public static void Fill(int[] array, byte defaultValue)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = defaultValue;
}
}
2、Array 转成ArrayList
public static ArrayList AsList(Array arr)
{
if (arr.Length <= 0)
return new ArrayList();
ArrayList al = new ArrayList(arr.Length);
for (int i = 0; i < arr.Length; i++)
{
al.Add(arr.GetValue(i));
}
return al;
}
3、比较两个数组是否相等
public new static bool Equals(object a1, object b1)
{
if (a1 == null || b1 == null)
return false;
Array a = a1 as Array;
Array b = b1 as Array;
if (a.Length != b.Length)
return false;
for (int i = 0; i < a.Length; i++)
{
if (!a.GetValue(i).Equals(b.GetValue(i)))
return false;
}
return true;
}
public static bool Equals(Object[] a, Object[] a2)
{
if (a == a2)
return true;
if (a == null || a2 == null)
return false;
int length = a.Length;
if (a2.Length != length)
return false;
for (int i = 0; i < length; i++)
{
Object o1 = a[i];
Object o2 = a2[i];
if (!(o1 == null ? o2 == null : o1.Equals(o2)))
return false;
}
return true;
}
public static bool DeepEquals(Object[] a1, Object[] a2) {
if (a1 == a2)
return true;
if (a1 == null || a2==null)
return false;
int length = a1.Length;
if (a2.Length != length)
return false;
for (int i = 0; i < length; i++) {
Object e1 = a1[i];
Object e2 = a2[i];
if (e1 == e2)
continue;
if (e1 == null)
return false;
// Figure out whether the two elements are equal
bool eq = DeepEquals0(e1, e2);
if (!eq)
return false;
}
return true;
}
static bool DeepEquals0(Object e1, Object e2) {
bool eq;
if (e1 is Object[] && e2 is Object[])
eq = DeepEquals ((Object[]) e1, (Object[]) e2);
else if (e1 is byte[] && e2 is byte[])
eq = Equals((byte[]) e1, (byte[]) e2);
else if (e1 is short[] && e2 is short[])
eq = Equals((short[]) e1, (short[]) e2);
else if (e1 is int[] && e2 is int[])
eq = Equals((int[]) e1, (int[]) e2);
else if (e1 is long[] && e2 is long[])
eq = Equals((long[]) e1, (long[]) e2);
else if (e1 is char[] && e2 is char[])
eq = Equals((char[]) e1, (char[]) e2);
else if (e1 is float[] && e2 is float[])
eq = Equals((float[]) e1, (float[]) e2);
else if (e1 is double[] && e2 is double[])
eq = Equals((double[]) e1, (double[]) e2);
else if (e1 is bool[] && e2 is bool[])
eq = Equals((bool[]) e1, (bool[]) e2);
else
eq = e1.Equals(e2);
return eq;
}
4、数组的拷贝方法
public static void ArrayMoveWithin(Object[] array, int moveFrom, int moveTo, int numToMove)
{
// If we're not asked to do anything, return now
if (numToMove <= 0) { return; }
if (moveFrom == moveTo) { return; }
// Check that the values supplied are valid
if (moveFrom < 0 || moveFrom >= array.Length)
{
throw new ArgumentException("The moveFrom must be a valid array index");
}
if (moveTo < 0 || moveTo >= array.Length)
{
throw new ArgumentException("The moveTo must be a valid array index");
}
if (moveFrom + numToMove > array.Length)
{
throw new ArgumentException("Asked to move more entries than the array has");
}
if (moveTo + numToMove > array.Length)
{
throw new ArgumentException("Asked to move to a position that doesn't have enough space");
}
// Grab the bit to move
Object[] toMove = new Object[numToMove];
Array.Copy(array, moveFrom, toMove, 0, numToMove);
// Grab the bit to be shifted
Object[] toShift;
int shiftTo;
if (moveFrom > moveTo)
{
// Moving to an earlier point in the array
// Grab everything between the two points
toShift = new Object[(moveFrom - moveTo)];
Array.Copy(array, moveTo, toShift, 0, toShift.Length);
shiftTo = moveTo + numToMove;
}
else
{
// Moving to a later point in the array
// Grab everything from after the toMove block, to the new point
toShift = new Object[(moveTo - moveFrom)];
Array.Copy(array, moveFrom + numToMove, toShift, 0, toShift.Length);
shiftTo = moveFrom;
}
// Copy the moved block to its new location
Array.Copy(toMove, 0, array, moveTo, toMove.Length);
// And copy the shifted block to the shifted location
Array.Copy(toShift, 0, array, shiftTo, toShift.Length);
// We're done - array will now have everything moved as required
}
public static byte[] CopyOf(byte[] source, int newLength)
{
byte[] result = new byte[newLength];
Array.Copy(source, 0, result, 0,
Math.Min(source.Length, newLength));
return result;
}
internal static int[] CopyOfRange(int[] original, int from, int to)
{
int newLength = to - from;
if (newLength < 0)
throw new ArgumentException(from + " > " + to);
int[] copy = new int[newLength];
Array.Copy(original, from, copy, 0,
Math.Min(original.Length - from, newLength));
return copy;
}
internal static byte[] CopyOfRange(byte[] original, int from, int to)
{
int newLength = to - from;
if (newLength < 0)
throw new ArgumentException(from + " > " + to);
byte[] copy = new byte[newLength];
Array.Copy(original, from, copy, 0,
Math.Min(original.Length - from, newLength));
return copy;
}
5、工具类方法完整代码
using System;
using System.Collections;
using System.Text;
using System.Collections.Generic;
using NPOI.Util.Collections;
namespace CJAVAPY.Util
{
public class Arrays
{
public static void Fill(byte[] array,byte defaultValue)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = defaultValue;
}
}
public static void Fill(char[] array, char defaultValue)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = defaultValue;
}
}
public static void Fill<T>(T[] array, T defaultValue)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = defaultValue;
}
}
public static void Fill(byte[] a, int fromIndex, int toIndex, byte val)
{
RangeCheck(a.Length, fromIndex, toIndex);
for (int i = fromIndex; i < toIndex; i++)
a[i] = val;
}
private static void RangeCheck(int length, int fromIndex, int toIndex)
{
if (fromIndex > toIndex)
{
throw new ArgumentException(
"fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")");
}
if (fromIndex < 0)
{
throw new IndexOutOfRangeException("fromIndex(" + fromIndex + ")");
}
if (toIndex > length)
{
throw new IndexOutOfRangeException( "toIndex(" + toIndex + ")");
}
}
public static ArrayList AsList(Array arr)
{
if (arr.Length <= 0)
return new ArrayList();
ArrayList al = new ArrayList(arr.Length);
for (int i = 0; i < arr.Length; i++)
{
al.Add(arr.GetValue(i));
}
return al;
}
public static void Fill(int[] array, byte defaultValue)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = defaultValue;
}
}
public new static bool Equals(object a1, object b1)
{
if (a1 == null || b1 == null)
return false;
Array a = a1 as Array;
Array b = b1 as Array;
if (a.Length != b.Length)
return false;
for (int i = 0; i < a.Length; i++)
{
if (!a.GetValue(i).Equals(b.GetValue(i)))
return false;
}
return true;
}
public static bool Equals(Object[] a, Object[] a2)
{
if (a == a2)
return true;
if (a == null || a2 == null)
return false;
int length = a.Length;
if (a2.Length != length)
return false;
for (int i = 0; i < length; i++)
{
Object o1 = a[i];
Object o2 = a2[i];
if (!(o1 == null ? o2 == null : o1.Equals(o2)))
return false;
}
return true;
}
public static void ArrayMoveWithin(Object[] array, int moveFrom, int moveTo, int numToMove)
{
// If we're not asked to do anything, return now
if (numToMove <= 0) { return; }
if (moveFrom == moveTo) { return; }
// Check that the values supplied are valid
if (moveFrom < 0 || moveFrom >= array.Length)
{
throw new ArgumentException("The moveFrom must be a valid array index");
}
if (moveTo < 0 || moveTo >= array.Length)
{
throw new ArgumentException("The moveTo must be a valid array index");
}
if (moveFrom + numToMove > array.Length)
{
throw new ArgumentException("Asked to move more entries than the array has");
}
if (moveTo + numToMove > array.Length)
{
throw new ArgumentException("Asked to move to a position that doesn't have enough space");
}
// Grab the bit to move
Object[] toMove = new Object[numToMove];
Array.Copy(array, moveFrom, toMove, 0, numToMove);
// Grab the bit to be shifted
Object[] toShift;
int shiftTo;
if (moveFrom > moveTo)
{
// Moving to an earlier point in the array
// Grab everything between the two points
toShift = new Object[(moveFrom - moveTo)];
Array.Copy(array, moveTo, toShift, 0, toShift.Length);
shiftTo = moveTo + numToMove;
}
else
{
// Moving to a later point in the array
// Grab everything from after the toMove block, to the new point
toShift = new Object[(moveTo - moveFrom)];
Array.Copy(array, moveFrom + numToMove, toShift, 0, toShift.Length);
shiftTo = moveFrom;
}
// Copy the moved block to its new location
Array.Copy(toMove, 0, array, moveTo, toMove.Length);
// And copy the shifted block to the shifted location
Array.Copy(toShift, 0, array, shiftTo, toShift.Length);
// We're done - array will now have everything moved as required
}
public static byte[] CopyOf(byte[] source, int newLength)
{
byte[] result = new byte[newLength];
Array.Copy(source, 0, result, 0,
Math.Min(source.Length, newLength));
return result;
}
internal static int[] CopyOfRange(int[] original, int from, int to)
{
int newLength = to - from;
if (newLength < 0)
throw new ArgumentException(from + " > " + to);
int[] copy = new int[newLength];
Array.Copy(original, from, copy, 0,
Math.Min(original.Length - from, newLength));
return copy;
}
internal static byte[] CopyOfRange(byte[] original, int from, int to)
{
int newLength = to - from;
if (newLength < 0)
throw new ArgumentException(from + " > " + to);
byte[] copy = new byte[newLength];
Array.Copy(original, from, copy, 0,
Math.Min(original.Length - from, newLength));
return copy;
}
public static int HashCode(long[] a) {
if (a == null)
return 0;
int result = 1;
foreach (long element in a) {
int elementHash = (int)(element ^ (Operator.UnsignedRightShift(element , 32)));
result = 31 * result + elementHash;
}
return result;
}
public static int HashCode(int[] a) {
if (a == null)
return 0;
int result = 1;
foreach (int element in a)
result = 31 * result + element;
return result;
}
public static int HashCode(short[] a) {
if (a == null)
return 0;
int result = 1;
foreach (short element in a)
result = 31 * result + element;
return result;
}
public static int HashCode(char[] a) {
if (a == null)
return 0;
int result = 1;
foreach (char element in a)
result = 31 * result + element;
return result;
}
public static int HashCode(byte[] a) {
if (a == null)
return 0;
int result = 1;
foreach (byte element in a)
result = 31 * result + element;
return result;
}
public static int HashCode(bool[] a) {
if (a == null)
return 0;
int result = 1;
foreach (bool element in a)
result = 31 * result + (element ? 1231 : 1237);
return result;
}
public static int HashCode(float[] a) {
if (a == null)
return 0;
int result = 1;
foreach (float element in a)
{
result = 31 * result + BitConverter.ToInt32(BitConverter.GetBytes(element), 0);
}
return result;
}
public static int HashCode(double[] a) {
if (a == null)
return 0;
int result = 1;
foreach (double element in a) {
long bits = BitConverter.DoubleToInt64Bits(element);
result = 31 * result + (int)(bits ^ (Operator.UnsignedRightShift(bits, 32)));
}
return result;
}
public static int HashCode(Object[] a) {
if (a == null)
return 0;
int result = 1;
foreach (Object element in a)
result = 31 * result + (element == null ? 0 : element.GetHashCode());
return result;
}
public static int DeepHashCode(Object[] a) {
if (a == null)
return 0;
int result = 1;
foreach (Object element in a) {
int elementHash = 0;
if (element is Object[])
elementHash = DeepHashCode((Object[]) element);
else if (element is byte[])
elementHash = HashCode((byte[]) element);
else if (element is short[])
elementHash = HashCode((short[]) element);
else if (element is int[])
elementHash = HashCode((int[]) element);
else if (element is long[])
elementHash = HashCode((long[]) element);
else if (element is char[])
elementHash = HashCode((char[]) element);
else if (element is float[])
elementHash = HashCode((float[]) element);
else if (element is double[])
elementHash = HashCode((double[]) element);
else if (element is bool[])
elementHash = HashCode((bool[]) element);
else if (element != null)
elementHash = element.GetHashCode();
result = 31 * result + elementHash;
}
return result;
}
public static bool DeepEquals(Object[] a1, Object[] a2) {
if (a1 == a2)
return true;
if (a1 == null || a2==null)
return false;
int length = a1.Length;
if (a2.Length != length)
return false;
for (int i = 0; i < length; i++) {
Object e1 = a1[i];
Object e2 = a2[i];
if (e1 == e2)
continue;
if (e1 == null)
return false;
// Figure out whether the two elements are equal
bool eq = DeepEquals0(e1, e2);
if (!eq)
return false;
}
return true;
}
static bool DeepEquals0(Object e1, Object e2) {
bool eq;
if (e1 is Object[] && e2 is Object[])
eq = DeepEquals ((Object[]) e1, (Object[]) e2);
else if (e1 is byte[] && e2 is byte[])
eq = Equals((byte[]) e1, (byte[]) e2);
else if (e1 is short[] && e2 is short[])
eq = Equals((short[]) e1, (short[]) e2);
else if (e1 is int[] && e2 is int[])
eq = Equals((int[]) e1, (int[]) e2);
else if (e1 is long[] && e2 is long[])
eq = Equals((long[]) e1, (long[]) e2);
else if (e1 is char[] && e2 is char[])
eq = Equals((char[]) e1, (char[]) e2);
else if (e1 is float[] && e2 is float[])
eq = Equals((float[]) e1, (float[]) e2);
else if (e1 is double[] && e2 is double[])
eq = Equals((double[]) e1, (double[]) e2);
else if (e1 is bool[] && e2 is bool[])
eq = Equals((bool[]) e1, (bool[]) e2);
else
eq = e1.Equals(e2);
return eq;
}
public static String ToString(long[] a) {
if (a == null)
return "null";
int iMax = a.Length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.Append('[');
for (int i = 0; ; i++) {
b.Append(a[i]);
if (i == iMax)
return b.Append(']').ToString();
b.Append(", ");
}
}
public static String ToString(int[] a) {
if (a == null)
return "null";
int iMax = a.Length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.Append('[');
for (int i = 0; ; i++) {
b.Append(a[i]);
if (i == iMax)
return b.Append(']').ToString();
b.Append(", ");
}
}
public static String ToString(short[] a) {
if (a == null)
return "null";
int iMax = a.Length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.Append('[');
for (int i = 0; ; i++) {
b.Append(a[i]);
if (i == iMax)
return b.Append(']').ToString();
b.Append(", ");
}
}
public static String ToString(char[] a) {
if (a == null)
return "null";
int iMax = a.Length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.Append('[');
for (int i = 0; ; i++) {
b.Append(a[i]);
if (i == iMax)
return b.Append(']').ToString();
b.Append(", ");
}
}
public static String ToString(byte[] a) {
if (a == null)
return "null";
int iMax = a.Length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.Append('[');
for (int i = 0; ; i++) {
b.Append(a[i]);
if (i == iMax)
return b.Append(']').ToString();
b.Append(", ");
}
}
public static String ToString(bool[] a) {
if (a == null)
return "null";
int iMax = a.Length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.Append('[');
for (int i = 0; ; i++) {
b.Append(a[i]);
if (i == iMax)
return b.Append(']').ToString();
b.Append(", ");
}
}
public static String ToString(float[] a) {
if (a == null)
return "null";
int iMax = a.Length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.Append('[');
for (int i = 0; ; i++) {
b.Append(a[i]);
if (i == iMax)
return b.Append(']').ToString();
b.Append(", ");
}
}
public static String ToString(double[] a) {
if (a == null)
return "null";
int iMax = a.Length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.Append('[');
for (int i = 0; ; i++) {
b.Append(a[i]);
if (i == iMax)
return b.Append(']').ToString();
b.Append(", ");
}
}
public static String DeepToString(Object[] a) {
if (a == null)
return "null";
int bufLen = 20 * a.Length;
if (a.Length != 0 && bufLen <= 0)
bufLen = Int32.MaxValue;
StringBuilder buf = new StringBuilder(bufLen);
DeepToString(a, buf, new NPOI.Util.Collections.HashSet<Object[]>());
return buf.ToString();
}
private static void DeepToString(Object[] a, StringBuilder buf,
NPOI.Util.Collections.HashSet<Object[]> dejaVu)
{
if (a == null)
{
buf.Append("null");
return;
}
int iMax = a.Length - 1;
if (iMax == -1)
{
buf.Append("[]");
return;
}
dejaVu.Add(a);
buf.Append('[');
for (int i = 0; ; i++)
{
Object element = a[i];
if (element == null)
{
buf.Append("null");
}
else
{
Type eClass = element.GetType();
//Class<?> eClass = element.Class;
if (eClass.IsArray)
{
if (eClass == typeof(byte[]))
buf.Append(ToString((byte[])element));
else if (eClass == typeof(short[]))
buf.Append(ToString((short[])element));
else if (eClass == typeof(int[]))
buf.Append(ToString((int[])element));
else if (eClass == typeof(long[]))
buf.Append(ToString((long[])element));
else if (eClass == typeof(char[]))
buf.Append(ToString((char[])element));
else if (eClass == typeof(float[]))
buf.Append(ToString((float[])element));
else if (eClass == typeof(double[]))
buf.Append(ToString((double[])element));
else if (eClass == typeof(bool[]))
buf.Append(ToString((bool[])element));
else
{ // element is an array of object references
if (dejaVu.Contains((element as object[])))
buf.Append("[...]");
else
DeepToString((Object[])element, buf, dejaVu);
}
}
else
{ // element is non-null and not an array
buf.Append(element.ToString());
}
}
if (i == iMax)
break;
buf.Append(", ");
}
buf.Append(']');
dejaVu.Remove(a);
}
public static String ToString(Object[] a)
{
if (a == null)
return "null";
int iMax = a.Length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.Append('[');
for (int i = 0; ; i++)
{
b.Append(a[i].ToString());
if (i == iMax)
return b.Append(']').ToString();
b.Append(", ");
}
}
}
}