今天遇到的问题是,要做一个名单维护的功能,名单维护需要复核操作,但在提交复核操作前,系统需要判断修改前名单和修改后名单是否是一样的,如果是一样的就要报错。
出于前后台互不信任的考虑,这个功能要在前后台分别实现一次,因为项目中前台客户端用的是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
来源:oschina
链接:https://my.oschina.net/u/1425762/blog/597975