[英]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.