Учитывая список IP-адреса, как Вы находите минуту, макс.?

В Java у меня есть arrayList IP-адреса. как я нахожу минуту и макс.?

Я использовал Collection.min (), но он не работает, учитывая случай как:

192.168.0.1  <--min 
192.168.0.250
192.168.0.9  <--max

как я возвращаюсь

192.168.0.1  <--min
192.168.0.250 <--max

вместо этого?


ArrayList, получают от базы данных. Я должен был бы сделать эту операцию на галочку (каждая галочка в интервале 5 секунд). Количество IP-адреса поразило бы макс. из, вероятно, 300.

6
задан zeroin23 12 May 2010 в 02:40
поделиться

5 ответов

Ссылаясь на Java - IP Address to Integer and back

public static String intToIp(int i) {
    return ((i >> 24 ) & 0xFF) + "." +
           ((i >> 16 ) & 0xFF) + "." +
           ((i >>  8 ) & 0xFF) + "." +
           ( i        & 0xFF);
}

public static Long ipToInt(String addr) {
    String[] addrArray = addr.split("\\.");

    long num = 0;
    for (int i=0;i<addrArray.length;i++) {
        int power = 3-i;

        num += ((Integer.parseInt(addrArray[i])%256 * Math.pow(256,power)));
    }
    return num;
}

Получив из базы данных строку Ip address String, я преобразовал все в ArrayList, а затем применил Collection.min(). Затем я конвертирую длинные в целые и обратно в строку. Чтобы получить отсортированную строку ip-адресов.

Спасибо

2
ответ дан 8 December 2019 в 04:28
поделиться

Если вы обрабатываете IP-адреса как целое число (длинное), вы можете отсортировать по нему. Напишите настраиваемый компаратор, который может разбить IP-адрес на массив целых чисел, а затем создать общее значение int, выполнив следующие действия.

//Split and convert the address into an array of ints...

addressIntValue =  address[0] * 256 * 256 * 256
addressIntValue += address[1] * 256 * 256
addressIntValue += address[2] * 256
addressIntValue += address[3]

Затем вы можете отсортировать по «addressIntValue».

2
ответ дан 8 December 2019 в 04:28
поделиться

Преобразуйте IP-адрес в длинное целое число, затем отсортируйте его. 192.168.0.1 можно преобразовать в целое число с помощью двоичной арифметики/операторов:

( 192 << 24 ) + ( 168 << 16 ) + ( 0 << 8 ) + ( 1 << 0 )

и так далее. Прочитайте комментарии ниже об использовании правильного типа данных.

13
ответ дан 8 December 2019 в 04:28
поделиться

Сохраняете ли вы IP-адреса как экземпляры String ? Вероятно, это так, потому что String отсортированы лексикографически, что означает «10» <«2» .

Если вы хотите отсортировать их численно, есть несколько способов:

  • Вместо того, чтобы помещать их в List , поместите их в List
    • или, может быть, даже SortedSet
  • Сохранить список List , но предоставить настраиваемый компаратор, который преобразует String в числовое значение для сравнения {{1 }}
    • может быть не самым эффективным, но работает без серьезных изменений существующей инфраструктуры
      • хотя, возможно, серьезные изменения - неплохая идея для начала ...

Вот пример, который объединяет и то, и другое в один:

import java.util.*;

public class IPSorter {
    static Long toNumeric(String ip) {
        Scanner sc = new Scanner(ip).useDelimiter("\\.");
        return 
            (sc.nextLong() << 24) + 
            (sc.nextLong() << 16) + 
            (sc.nextLong() << 8) + 
            (sc.nextLong()); 
    }
    public static void main(String[] args) {
        Comparator<String> ipComparator = new Comparator<String>() {
            @Override public int compare(String ip1, String ip2) {
                return toNumeric(ip1).compareTo(toNumeric(ip2));
            }       
        };
        SortedSet<String> ips = new TreeSet<String>(ipComparator);
        ips.addAll(Arrays.asList(
            "192.168.0.1", "192.168.0.250", "192.168.0.9", "9.9.9.9"
        ));
        System.out.println(ips);
        // "[9.9.9.9, 192.168.0.1, 192.168.0.9, 192.168.0.250]"
    }
}

Ссылки API

7
ответ дан 8 December 2019 в 04:28
поделиться

Если вы не хотите разбирать IP вручную, вы можете использовать InetAddress class

InetAddress ia1 = InetAddress.getByName("192.168.0.9");
InetAddress ia2 = InetAddress.getByName("192.168.0.234");

System.out.println(ia1.hashCode() < ia2.hashCode());

Я использую hashCode() метод, потому что он возвращает адрес в виде числа для ipv4. Вы также можете сравнить массивы, возвращаемые InetAddress.getAddress()

EDIT Использование hashCode() является недокументированной возможностью, и могут возникнуть проблемы, если у вас есть адреса ipv6 и ipv4. Поэтому лучше всего сравнивать массивы байтов или преобразовывать их в число вручную.

1
ответ дан 8 December 2019 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: