Java/C#代码:名单提交修改前比较是否相等

本秂侑毒 提交于 2020-03-02 02:16:57

今天遇到的问题是,要做一个名单维护的功能,名单维护需要复核操作,但在提交复核操作前,系统需要判断修改前名单和修改后名单是否是一样的,如果是一样的就要报错。

出于前后台互不信任的考虑,这个功能要在前后台分别实现一次,因为项目中前台客户端用的是C#语言编写,后台服务用的是Java语言,所以我把这个功能用两种语言分别实现了一次。

一、Java语言(后台)的实现方式

思路如下:

1、先进行一些简单的比较,如两个数组都为空,则认为是相等的,如两个数组长度不相等,则认为是不相等的

2、如果两个数组都不为空且长度相等,则对这两个数组分别进行排序,再逐一比对相同位置的人是否是同一人

我的Java版本为1.8.0_25,Java代码如下:

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】

上面这段代码,可以使用Lambda表达式,以省去建立类TestObjComparator的步骤。

方法是将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#语言(前台)的实现方式

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!