В 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.
Ссылаясь на 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-адресов.
Спасибо
Если вы обрабатываете 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».
Преобразуйте IP-адрес в длинное целое число, затем отсортируйте его. 192.168.0.1
можно преобразовать в целое число с помощью двоичной арифметики/операторов:
( 192 << 24 ) + ( 168 << 16 ) + ( 0 << 8 ) + ( 1 << 0 )
и так далее. Прочитайте комментарии ниже об использовании правильного типа данных.
Сохраняете ли вы 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]"
}
}
Если вы не хотите разбирать 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. Поэтому лучше всего сравнивать массивы байтов или преобразовывать их в число вручную.