/* * This is free and unencumbered software released into the public domain. * * Anyone is free to copy, modify, publish, use, compile, sell, or * distribute this software, either in source code form or as a compiled * binary, for any purpose, commercial or non-commercial, and by any * means. * * In jurisdictions that recognize copyright laws, the author or authors * of this software dedicate any and all copyright interest in the * software to the public domain. We make this dedication for the benefit * of the public at large and to the detriment of our heirs and * successors. We intend this dedication to be an overt act of * relinquishment in perpetuity of all present and future rights to this * software under copyright law. * * 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 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. * * For more information, please refer to <http://unlicense.org/> */ package jxtn.core.axi.comparators; import java.util.Comparator; /** * 成員比較器。 * <p> * 支援null:null項目或成員作為較小的一方。 * </p> * * @author AqD */ public final class ArrayComparators { /** * 取得boolean陣列的比較器。 * * @return boolean陣列的比較器 */ public static final Comparator<boolean[]> forBooleans() { return new Comparator<boolean[]>() { @Override public int compare(boolean[] m1, boolean[] m2) { return ArrayComparators.compare(m1, m2); } }; } /** * 取得byte陣列的比較器。 * * @return byte陣列的比較器 */ public static final Comparator<byte[]> forBytes() { return new Comparator<byte[]>() { @Override public int compare(byte[] m1, byte[] m2) { return ArrayComparators.compare(m1, m2); } }; } /** * 取得char陣列的比較器。 * * @return char陣列的比較器 */ public static final Comparator<char[]> forChars() { return new Comparator<char[]>() { @Override public int compare(char[] m1, char[] m2) { return ArrayComparators.compare(m1, m2); } }; } /** * 取得short陣列的比較器。 * * @return short陣列的比較器 */ public static final Comparator<short[]> forShorts() { return new Comparator<short[]>() { @Override public int compare(short[] m1, short[] m2) { return ArrayComparators.compare(m1, m2); } }; } /** * 取得int陣列的比較器。 * * @return int陣列的比較器 */ public static final Comparator<int[]> forInts() { return new Comparator<int[]>() { @Override public int compare(int[] m1, int[] m2) { return ArrayComparators.compare(m1, m2); } }; } /** * 取得long陣列的比較器。 * * @return long陣列的比較器 */ public static final Comparator<long[]> forLongs() { return new Comparator<long[]>() { @Override public int compare(long[] m1, long[] m2) { return ArrayComparators.compare(m1, m2); } }; } /** * 取得float陣列的比較器。 * * @return float陣列的比較器 */ public static final Comparator<float[]> forFloats() { return new Comparator<float[]>() { @Override public int compare(float[] m1, float[] m2) { return ArrayComparators.compare(m1, m2); } }; } /** * 取得double陣列的比較器。 * * @return double陣列的比較器 */ public static final Comparator<double[]> forDoubles() { return new Comparator<double[]>() { @Override public int compare(double[] m1, double[] m2) { return ArrayComparators.compare(m1, m2); } }; } /** * 取得{@link Comparable}陣列的比較器。 * * @param <T> 陣列項目型態 * @return {@link Comparable}陣列的比較器 */ @SuppressWarnings("rawtypes") public static final <T extends Comparable> Comparator<T[]> forComparables() { return new Comparator<T[]>() { @Override public int compare(T[] m1, T[] m2) { return ArrayComparators.compare(m1, m2); } }; } /** * 取得物件陣列的比較器。 * * @return 物件陣列的比較器 */ public static final Comparator<Object[]> forObjects() { return new Comparator<Object[]>() { @Override public int compare(Object[] m1, Object[] m2) { return ArrayComparators.compare(m1, m2); } }; } /** * 比較兩陣列。 * <p> * 支援null:null項目或成員作為較小的一方。 * </p> * * @param m1 陣列1,可為null * @param m2 陣列2,可為null * @return 0表示兩陣列相等,大於0表示{@code m1}大於{@code m2},小於0表示{@code m1}小於{@code m2} */ public static int compare(boolean[] m1, boolean[] m2) { if (m1 == null && m2 == null) { return 0; } if (m1 == null) { return -1; } if (m2 == null) { return 1; } int len = Math.min(m1.length, m2.length); for (int i = 0; i < len; i++) { boolean v1 = m1[i]; boolean v2 = m2[i]; if (v1 != v2) { return v1 ? 1 : -1; } } return m1.length - m2.length; } /** * 比較兩陣列。 * <p> * 支援null:null項目或成員作為較小的一方。 * </p> * * @param m1 陣列1,可為null * @param m2 陣列2,可為null * @return 0表示兩陣列相等,大於0表示{@code m1}大於{@code m2},小於0表示{@code m1}小於{@code m2} */ public static int compare(byte[] m1, byte[] m2) { if (m1 == null && m2 == null) { return 0; } if (m1 == null) { return -1; } if (m2 == null) { return 1; } int len = Math.min(m1.length, m2.length); for (int i = 0; i < len; i++) { byte v1 = m1[i]; byte v2 = m2[i]; int diff = v1 - v2; if (diff != 0) { return diff > 0 ? 1 : -1; } } return m1.length - m2.length; } /** * 比較兩陣列。 * <p> * 支援null:null項目或成員作為較小的一方。 * </p> * * @param m1 陣列1,可為null * @param m2 陣列2,可為null * @return 0表示兩陣列相等,大於0表示{@code m1}大於{@code m2},小於0表示{@code m1}小於{@code m2} */ public static int compare(char[] m1, char[] m2) { if (m1 == null && m2 == null) { return 0; } if (m1 == null) { return -1; } if (m2 == null) { return 1; } int len = Math.min(m1.length, m2.length); for (int i = 0; i < len; i++) { char v1 = m1[i]; char v2 = m2[i]; int diff = v1 - v2; if (diff != 0) { return diff > 0 ? 1 : -1; } } return m1.length - m2.length; } /** * 比較兩陣列。 * <p> * 支援null:null項目或成員作為較小的一方。 * </p> * * @param m1 陣列1,可為null * @param m2 陣列2,可為null * @return 0表示兩陣列相等,大於0表示{@code m1}大於{@code m2},小於0表示{@code m1}小於{@code m2} */ public static int compare(short[] m1, short[] m2) { if (m1 == null && m2 == null) { return 0; } if (m1 == null) { return -1; } if (m2 == null) { return 1; } int len = Math.min(m1.length, m2.length); for (int i = 0; i < len; i++) { short v1 = m1[i]; short v2 = m2[i]; int diff = v1 - v2; if (diff != 0) { return diff > 0 ? 1 : -1; } } return m1.length - m2.length; } /** * 比較兩陣列。 * <p> * 支援null:null項目或成員作為較小的一方。 * </p> * * @param m1 陣列1,可為null * @param m2 陣列2,可為null * @return 0表示兩陣列相等,大於0表示{@code m1}大於{@code m2},小於0表示{@code m1}小於{@code m2} */ public static int compare(int[] m1, int[] m2) { if (m1 == null && m2 == null) { return 0; } if (m1 == null) { return -1; } if (m2 == null) { return 1; } int len = Math.min(m1.length, m2.length); for (int i = 0; i < len; i++) { int v1 = m1[i]; int v2 = m2[i]; int diff = v1 - v2; if (diff != 0) { return diff > 0 ? 1 : -1; } } return m1.length - m2.length; } /** * 比較兩陣列。 * <p> * 支援null:null項目或成員作為較小的一方。 * </p> * * @param m1 陣列1,可為null * @param m2 陣列2,可為null * @return 0表示兩陣列相等,大於0表示{@code m1}大於{@code m2},小於0表示{@code m1}小於{@code m2} */ public static int compare(long[] m1, long[] m2) { if (m1 == null && m2 == null) { return 0; } if (m1 == null) { return -1; } if (m2 == null) { return 1; } int len = Math.min(m1.length, m2.length); for (int i = 0; i < len; i++) { long v1 = m1[i]; long v2 = m2[i]; long diff = v1 - v2; if (diff != 0) { return diff > 0 ? 1 : -1; } } return m1.length - m2.length; } /** * 比較兩陣列。 * <p> * 支援null:null項目或成員作為較小的一方。 * </p> * * @param m1 陣列1,可為null * @param m2 陣列2,可為null * @return 0表示兩陣列相等,大於0表示{@code m1}大於{@code m2},小於0表示{@code m1}小於{@code m2} */ public static int compare(float[] m1, float[] m2) { if (m1 == null && m2 == null) { return 0; } if (m1 == null) { return -1; } if (m2 == null) { return 1; } int len = Math.min(m1.length, m2.length); for (int i = 0; i < len; i++) { float v1 = m1[i]; float v2 = m2[i]; float diff = v1 - v2; if (diff != 0) { return diff > 0 ? 1 : -1; } } return m1.length - m2.length; } /** * 比較兩陣列。 * <p> * 支援null:null項目或成員作為較小的一方。 * </p> * * @param m1 陣列1,可為null * @param m2 陣列2,可為null * @return 0表示兩陣列相等,大於0表示{@code m1}大於{@code m2},小於0表示{@code m1}小於{@code m2} */ public static int compare(double[] m1, double[] m2) { if (m1 == null && m2 == null) { return 0; } if (m1 == null) { return -1; } if (m2 == null) { return 1; } int len = Math.min(m1.length, m2.length); for (int i = 0; i < len; i++) { double v1 = m1[i]; double v2 = m2[i]; double diff = v1 - v2; if (diff != 0) { return diff > 0 ? 1 : -1; } } return m1.length - m2.length; } /** * 比較兩陣列。 * <p> * 支援null:null項目或成員作為較小的一方。 * </p> * * @param <T> 陣列項目型態 * @param m1 陣列1,可為null * @param m2 陣列2,可為null * @return 0表示兩陣列相等,大於0表示{@code m1}大於{@code m2},小於0表示{@code m1}小於{@code m2} */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static <T extends Comparable> int compare(T[] m1, T[] m2) { if (m1 == null && m2 == null) { return 0; } if (m1 == null) { return -1; } if (m2 == null) { return 1; } int len = Math.min(m1.length, m2.length); for (int i = 0; i < len; i++) { T v1 = m1[i]; T v2 = m2[i]; if (v1 == null && v2 == null) { continue; } if (v1 == null) { return -1; } if (v2 == null) { return 1; } int diff = v1.compareTo(v2); if (diff != 0) { return diff; } } return m1.length - m2.length; } @SuppressWarnings({ "rawtypes", "unchecked" }) public static int compare(Object[] m1, Object[] m2) { if (m1 == null && m2 == null) { return 0; } if (m1 == null) { return -1; } if (m2 == null) { return 1; } int len = Math.min(m1.length, m2.length); for (int i = 0; i < len; i++) { Object v1 = m1[i]; Object v2 = m2[i]; if (v1 == null && v2 == null) { continue; } if (v1 == null) { return -1; } if (v2 == null) { return 1; } int diff; if (v1 instanceof Comparable) { diff = ((Comparable) v1).compareTo(v2); } else if (v2 instanceof Comparable) { diff = -((Comparable) v2).compareTo(v1); } else { diff = v1.toString().compareTo(v2.toString()); } if (diff != 0) { return diff; } } return m1.length - m2.length; } private ArrayComparators() { } }