判断两组IP是否包含相同的IP值

有这么一个需求:判断两组IP是否包含相同的IP值。IP组表示为单个IP和IP段的组合,比如

   10.1.1.3,10.1.2.4-10.1.2.10,10.1.2.20-10.1.2.30

现在需要判断这种格式的两组IP是否包含了相同的IP值,只要有一个相同的IP值就行。比如1.1.1.3和1.1.1.1-1.1.1.4就包含了一个相同的IP 1.1.1.3。

为了比较的方便,首先我们要把IP格式化一下,把1.1.1.3变成 001.001.001.003,也就是把一个IP中每个部分都变成3位,不到3位的左边补上0。然后每个IP组分成单个IP和IP段的List,再分别拿一个IP组的单个IP或者IP段和另一个IP组比较。

代码如下:

	public static boolean hasSameIp(String ip1, String ip2) {
		String[] ips1 = ip1.split(",");
		String[] ips2 = ip2.split(",");
		
		for (int i = 0 ; i < ips1.length ; i++) {
			String[] parts = ips1[i].split("\\-");
			format(parts);
			if (parts.length == 1) {
				ips1[i] = parts[0];
			} else {
				ips1[i] = parts[0] + "-" + parts[1];
			}
		}
		
		for (int i = 0 ; i < ips2.length ; i++) {
			String[] parts = ips2[i].split("\\-");
			format(parts);
			if (parts.length == 1) {
				ips2[i] = parts[0];
			} else {
				ips2[i] = parts[0] + "-" + parts[1];
			}
		}
		
		for (String _ip1 : ips1) {
			if (_ip1.contains("-")) {
				if (hasSameIp2(_ip1.substring(0, _ip1.indexOf("-")), _ip1.substring(_ip1.indexOf("-")+1), ips2)) {
					return true;
				}
			} else if (hasSameIp1(_ip1, ips2)) {
				return true;
			}
		}		

		for (String _ip2 : ips2) {
			if (_ip2.contains("-")) {
				if (hasSameIp2(_ip2.substring(0, _ip2.indexOf("-")), _ip2.substring(_ip2.indexOf("-")+1), ips1)) {
					return true;
				}
			} else if (hasSameIp1(_ip2, ips1)) {
				return true;
			}
		}		
		
		return false;
	}

	private static boolean hasSameIp2(String ip1, String ip2, String[] ips) {
		return hasSameIp1(ip1, ips) || hasSameIp1(ip2, ips);
	}

	private static boolean hasSameIp1(String ip, String[] ips) {
		for (String _ip : ips) {
			if (_ip.contains("-")) {
				String ip1 = _ip.substring(0, _ip.indexOf("-"));
				String ip2 = _ip.substring(_ip.indexOf("-")+1);
				if (ip.equals(ip1) || ip.equals(ip2)) {
					return true;
				}
				if (ip.compareTo(ip1) > 0 && ip.compareTo(ip2) < 0) {
					return true;
				}
			} else if (_ip.equals(ip)) {
				return true;
			}
		}
		return false;
	}

	private static void format(String[] parts) {
		for (int i = 0 ; i < parts.length ; i++) {
			String[] a = parts[i].split("\\.");
			for (int j = 0 ; j < a.length ; j++) {
				a[j] = "  "+a[j];
				a[j] = a[j].substring(a[j].length() - 3);
			}
			parts[i] = a[0] + "." + a[1] + "." + a[2] + "." + a[3];
		}
	}

然后写测试代码:

		System.out.println("1 "+hasSameIp("1.1.1.3", "1.1.1.3"));
		System.out.println("2 "+hasSameIp("1.1.1.3", "1.1.1.1-2.1.1.4"));
		System.out.println("3 "+hasSameIp("1.1.1.3", "1.1.1.3-1.1.1.4"));
		System.out.println("4 "+hasSameIp("1.1.1.3,1.1.1.8", "1.1.1.6-1.1.1.10"));
		System.out.println("5 "+hasSameIp("1.1.1.3,1.1.1.8", "1.1.1.3,1.1.1.9-1.1.1.10"));
		System.out.println("6 "+hasSameIp("1.1.1.3-1.1.1.4,1.1.1.8", "1.1.1.3,1.1.1.9-1.1.1.10"));
		System.out.println("7 "+hasSameIp("1.1.1.3-1.1.1.4,1.1.1.8", "1.1.1.1-1.1.1.6"));
		System.out.println("8 "+hasSameIp("1.1.1.3-1.1.1.5,1.1.1.8", "1.1.1.4-1.1.1.6"));
这些应该全部返回true。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Matlab中的Kolmogorov-Smirnov检验来检验两组数据是否符合相同的正态分布。具体步骤如下: 1. 导入数据并分别计算均和标准差。 2. 使用Matlab的normpdf函数来生成正态分布的概率密度函数。 3. 对于每个数据集,使用Matlab的ksdensity函数生成该数据集的核密度估计。 4. 使用Matlab的kstest2函数对两个核密度估计进行Kolmogorov-Smirnov检验。如果p小于显著性水平(通常为0.05),则拒绝原假设,即两个数据集不符合相同的正态分布。 以下是一个示例代码: ```matlab % 导入数据并计算均和标准差 data1 = [1, 2, 3, 4, 5]; data2 = [1.5, 2.5, 3.5, 4.5, 5.5]; mu1 = mean(data1); sigma1 = std(data1); mu2 = mean(data2); sigma2 = std(data2); % 生成正态分布的概率密度函数 x = linspace(-5, 10, 100); pdf1 = normpdf(x, mu1, sigma1); pdf2 = normpdf(x, mu2, sigma2); % 生成核密度估计 [~, f1] = ksdensity(data1, x); [~, f2] = ksdensity(data2, x); % 进行Kolmogorov-Smirnov检验 [h, p] = kstest2(f1, f2); if h == 0 disp('两个数据集符合相同的正态分布'); else disp('两个数据集不符合相同的正态分布'); end disp(['p为', num2str(p)]); ``` 在这个例子中,我们假设data1和data2都符合正态分布。我们首先计算每个数据集的均和标准差,并使用normpdf函数生成正态分布的概率密度函数。然后使用ksdensity函数对每个数据集进行核密度估计。最后使用kstest2函数对两个核密度估计进行Kolmogorov-Smirnov检验,并输出p判断两个数据集是否符合相同的正态分布。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值