簡體   English   中英

檢查列表的元素是否在 java 中的兩個 ip 地址之間

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM