[英]chek if the elements of the list is between two ip addresses in java
我想写一个 function 接收两个字符串类型的变量,代表两个 IP 地址和第三个变量代表一组 IP 地址。 function 从给定的地址集中返回 IP1 和 IP2 之间的所有地址,并考虑顺序。
这是 function 签名:
public static String[] get_available_IPs(String ip1, String ip2, String[] addresses)
我试图拆分每个 ip 以最后比较它们,但我没有得到任何结果
这是我在尝试解决此问题时编写的代码。 我不认为它会帮助你解决问题,但我只是想让你看看我做了什么。
String[] ip_numbers1 = ip1.split("\\.");
String[] ip_numbers2 = ip2.split("\\.");
String[][] ip_numbers3 = new String[4][addresses.length];
boolean[] flags = new boolean[4];
for (int i = 0; i < addresses.length; i++) {
for (int j = 0; j < 4; j++) {
String[] new1 = addresses[j].split("\\.");
for (int k = 0; k < 4; k++) {
ip_numbers3[j][k] = new1[k];
}
}
}
for (int i = 0; i < ip_numbers3.length; i++) {
if (Integer.parseInt(ip_numbers1[0]) <= Integer.parseInt(ip_numbers3[i][0])
&& Integer.parseInt(ip_numbers2[0]) >= Integer.parseInt(ip_numbers3[i][0])) {
flags[i] = true;
}
}
样本输入和输出:
input:
ip1 = '192.168.1.1'
ip2 = '220.150.1.0'
addresses = ['193.168.10.20','221.155.1.5','194.200.1.5','192.168.1.2']
output:
['194.200.1.5','193.168.10.20','192.168.1.2']
input:
ip1 = '191.168.1.1'
ip2 = '222.155.1.5'
addresses = ['193.168.10.20','221.155.1.5','194.200.1.5','192.168.1.1']
output:
['221.155.1.5','194.200.1.5','193.168.10.20','192.168.1.1']
java 中的字符串是Comparable
。 这意味着您可以使用ip1.compareTo(ip)
订购它们。 最好的部分是它甚至可以与.
在ips中。
这是一个代码示例,它告诉 ip 是否在另外两个(不包括)范围内。
public static Boolean check(String ip1, String ip2, String test){
return ip1.compareTo(test) < 0 && ip2.compareTo(test) > 0;
}
你可以在这里测试它: https://www.jdoodle.com/iembed/v0/vRZ
Since IP address are made of 4 "bytes" (numbers between 0 and 255), an IP can be encoded into an unsigned integer, and integer are definitely easier to use for operation involving comparison.
Java 中没有真正的无符号 integer,但可以使用 long。 以下是将 IP 转换为其长表示(和逆运算)的方法示例:
private static long ipToLong(String ipAsString) {
return Arrays.stream(ipAsString.split("\\."))
.map(Long::parseLong)
.reduce(0L, (built, b) -> (built << 8) | b);
}
private static String longToIp(long ipAsLong) {
return IntStream.of(24,16,8,0)
.mapToLong(n -> ((ipAsLong)>>n)&0xff)
.mapToObj(String::valueOf)
.collect(Collectors.joining("."));
}
这样,如果 IP1 的长表示低于 IP2 的长表示,则 IP1 将在 IP2 之前。 例如过滤 IP 地址:
public static String[] select(String ipStart, String ipEnd, String[] addresses) {
final var start = ipToLong(ipStart);
final var end = ipToLong(ipEnd);
final Predicate<String> isInRange = ip -> {final var value = ipToLong(ip);return value>=start && value<=end;};
return Arrays.stream(addresses).filter(isInRange).toArray(String[]::new);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.