今天遇到的問題是,要作一個名單維護的功能,名單維護須要複覈操做,但在提交複覈操做前,系統須要判斷修改前名單和修改後名單是不是同樣的,若是是同樣的就要報錯。java
出於先後臺互不信任的考慮,這個功能要在先後臺分別實現一次,由於項目中前臺客戶端用的是C#語言編寫,後臺服務用的是Java語言,因此我把這個功能用兩種語言分別實現了一次。數組
思路以下:ide
一、先進行一些簡單的比較,如兩個數組都爲空,則認爲是相等的,如兩個數組長度不相等,則認爲是不相等的函數
二、若是兩個數組都不爲空且長度相等,則對這兩個數組分別進行排序,再逐一比對相同位置的人是不是同一人工具
個人Java版本爲1.8.0_25,Java代碼以下:this
import java.util.Arrays; import java.util.Comparator; /** * 斷定兩數組是否具備相同數據 * * @文件名稱 Solution.java * @文件做者 Tsybius2014 * @建立時間 2016年1月4日 下午11:37:52 */ public class Solution { //被比較的類 public static class TestObj { public TestObj(String id) { this.id = id; } String id; public String getId() { return id; } public void setId(String id) { this.id = id; } } //排序規則 private class TestObjComparator implements Comparator<TestObj> { @Override public int compare(TestObj a, TestObj b) { return a.getId().compareTo(b.getId()); } } /** * 假設list1與list2是兩個不一樣的數組,兩個數組內的數據都是不重複的 * 判斷:在忽略數據順序的狀況下,兩組數據是否相等 * * @param list1 數組1 * @param list2 數組2 * @return */ public boolean isTheSameArray(TestObj[] array1, TestObj[] array2) { // 簡易判斷 if (array1 == null && (array2 == null || array2.length == 0)) { // array1爲空時,如array2也爲空或長度爲0,則認爲兩數組相等 return true; } else if (array2 == null && array1.length == 0) { // array2爲空時,如array1長度爲0,則認爲兩數組相等 return true; } else if (array1.length == 0 && array2.length == 0) { // array1與array2長度都爲0時,認爲兩數組相等 return true; } else if (array1.length != array2.length) { // array1與array2長度不相等時,認爲兩數組不相等 return false; } //對數組進行排序 Arrays.sort(array1, new TestObjComparator()); Arrays.sort(array2, new TestObjComparator()); // 判斷是否有不一致元素 for (int i = 0; i < array1.length; i++) { if (!array1[i].getId().equals(array2[i].getId())) { return false; } } return true; } }
補充一個小技巧:Eclipse自動生成get和set函數方法:光標停在在類中字段上,按下【Shift+Alt+S】,在彈出菜單中選擇【Generate Getters and Setters】spa
上面這段代碼,可使用Lambda表達式,以省去創建類TestObjComparator的步驟。code
方法是將Arrays.sort兩行替換以下:對象
Arrays.sort(array1, (a, b) -> { return a.getId().compareTo(b.getId()); }); Arrays.sort(array2, (a, b) -> { return a.getId().compareTo(b.getId()); });
調用這個函數的Main函數代碼以下所示排序
public class FuncTester { public static void main(String[] args) { Solution solution = new Solution(); System.out.println(solution.isTheSameArray( new Solution.TestObj[] { new Solution.TestObj("1"), new Solution.TestObj("2"), new Solution.TestObj("3") }, new Solution.TestObj[] { new Solution.TestObj("1"), new Solution.TestObj("2"), new Solution.TestObj("3") })); System.out.println(solution.isTheSameArray( new Solution.TestObj[] { new Solution.TestObj("2"), new Solution.TestObj("3") }, new Solution.TestObj[] { new Solution.TestObj("1"), new Solution.TestObj("2"), new Solution.TestObj("3") })); } }
兩種代碼的控制檯輸出結果都爲:
true false
C#語言的實現思路和Java語言相似
第一種思路是直接令被比較的業務對象繼承IComparable接口
個人.NET版本爲4.5.50983,C#代碼以下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FuncTest { class Solution { /// <summary> /// 假設list1與list2是兩個不一樣的數組,兩個數組內的數據都是不重複的 /// 判斷:在忽略數據順序的狀況下,兩組數據是否相等 /// </summary> /// <param name="array1">數組1</param> /// <param name="array2">數組2</param> /// <returns>true:相等,false:不相等</returns> public bool isTheSameArray(TestObj[] array1, TestObj[] array2) { // 簡易判斷 if (array1 == null && (array2 == null || array2.Length == 0)) { // array1爲空時,如array2也爲空或長度爲0,則認爲兩數組相等 return true; } else if (array2 == null && array1.Length == 0) { // array2爲空時,如array1長度爲0,則認爲兩數組相等 return true; } else if (array1.Length == 0 && array2.Length == 0) { // array1與array2長度都爲0時,認爲兩數組相等 return true; } else if (array1.Length != array2.Length) { // array1與array2長度不相等時,認爲兩數組不相等 return false; } //對數組進行排序 Array.Sort(array1); //方法1 Array.Sort(array2); //方法1 // 判斷是否有不一致元素 for (int i = 0; i < array1.Length; i++) { if (array1[i].getId() != array2[i].getId()) { return false; } } return true; } /// <summary> /// 被比較類 /// </summary> public class TestObj : IComparable<TestObj> { public TestObj(String id) { this.id = id; } String id; public String getId() { return id; } public void setId(String id) { this.id = id; } public int CompareTo(TestObj obj) { return this.id.CompareTo(obj.getId()); } } } }
第二種方法的思路是本身寫一個繼承接口System.Collections.IComparer的工具類用於實現比較:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FuncTest { class Solution { /// <summary> /// 假設list1與list2是兩個不一樣的數組,兩個數組內的數據都是不重複的 /// 判斷:在忽略數據順序的狀況下,兩組數據是否相等 /// </summary> /// <param name="array1">數組1</param> /// <param name="array2">數組2</param> /// <returns>true:相等,false:不相等</returns> public bool isTheSameArray(TestObj[] array1, TestObj[] array2) { // 簡易判斷 if (array1 == null && (array2 == null || array2.Length == 0)) { // array1爲空時,如array2也爲空或長度爲0,則認爲兩數組相等 return true; } else if (array2 == null && array1.Length == 0) { // array2爲空時,如array1長度爲0,則認爲兩數組相等 return true; } else if (array1.Length == 0 && array2.Length == 0) { // array1與array2長度都爲0時,認爲兩數組相等 return true; } else if (array1.Length != array2.Length) { // array1與array2長度不相等時,認爲兩數組不相等 return false; } //對數組進行排序 Array.Sort(array1, new TestObjComparer()); //方法2 Array.Sort(array2, new TestObjComparer()); //方法2 // 判斷是否有不一致元素 for (int i = 0; i < array1.Length; i++) { if (array1[i].getId() != array2[i].getId()) { return false; } } return true; } /// <summary> /// 被比較類 /// </summary> public class TestObj { public TestObj(String id) { this.id = id; } String id; public String getId() { return id; } public void setId(String id) { this.id = id; } } /// <summary> /// 實現兩個TestObj類的比較 /// </summary> public class TestObjComparer : System.Collections.IComparer { public int Compare(object a, object b) { if (!(a is TestObj) || !(b is TestObj)) { return -1; } else { return (a as TestObj).getId().CompareTo((b as TestObj).getId()); } } } } }
調用這兩段代碼的Main函數代碼以下所示
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FuncTest { class Program { static void Main(string[] args) { Solution solution = new Solution(); Console.WriteLine(solution.isTheSameArray( new Solution.TestObj[]{ new Solution.TestObj("1"), new Solution.TestObj("2"), new Solution.TestObj("3")}, new Solution.TestObj[]{ new Solution.TestObj("1"), new Solution.TestObj("2"), new Solution.TestObj("3")})); Console.Read(); } } }
輸出結果都爲
true
END