给出一个IP地址列表,你如何找到min,max?
在Java中,我有一个ip地址的arrayList。 我如何找到最小值和最大值?
我已经使用了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。
将IP地址转换为长整数,然后对其进行排序。 可以使用二进制算术/运算符将192.168.0.1
转换为整数:
( 192 << 24 ) + ( 168 << 16 ) + ( 0 << 8 ) + ( 1 << 0 )
等等。 请阅读以下有关使用正确数据类型的注释。
您是否将IP地址存储为String
实例? 这可能是这种情况,因为String
按字典顺序排序,意味着"10" < "2"
。
如果要以数字方式对它们进行排序,有以下几种方法:
- 而不是将它们放入
List
,而是将它们放入List
- 或者甚至是
SortedSet
- 或者甚至是
- 保留
List
,但提供自定义比较器,将String
转换为数值以进行比较- 可能效率不高,但在不对现有基础设施进行重大更改的情
- 虽然也许重大改变从一开始就不是一个坏主意......
- 可能效率不高,但在不对现有基础设施进行重大更改的情
这是一个将两者结合成一个的例子:
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 ipComparator = new Comparator () { @Override public int compare(String ip1, String ip2) { return toNumeric(ip1).compareTo(toNumeric(ip2)); } }; SortedSet ips = new TreeSet (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链接
-
java.util.Scanner
-
java.util.SortedSet
-
java.util.Comparator
参考Java – 整数和后面的IP地址
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
从数据库中检索Ip地址字符串,我将所有转换为ArrayList然后应用Collection.min()然后我将long转换回int然后再转换回String。 获取已排序的IP地址字符串。
谢谢
如果将IP地址视为整数(长整数),则可以对其进行排序。 编写一个自定义比较器,可以将IP地址拆分为一个int数组,然后通过执行以下操作创建一个total 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,可以使用InetAddress
类
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()返回的数组
编辑使用hashCode()
是一个未记录的function,如果您同时拥有ipv6和ipv4地址可能会出现问题。 因此,最好比较字节数组或手动将它们转换为数字。