Java/C#代碼:名單提交修改前比較是否相等

今天遇到的問題是,要作一個名單維護的功能,名單維護須要複覈操做,但在提交複覈操做前,系統須要判斷修改前名單和修改後名單是不是同樣的,若是是同樣的就要報錯。java

出於先後臺互不信任的考慮,這個功能要在先後臺分別實現一次,由於項目中前臺客戶端用的是C#語言編寫,後臺服務用的是Java語言,因此我把這個功能用兩種語言分別實現了一次。數組

1、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

2、C#語言(前臺)的實現方式

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

相關文章
相關標籤/搜索