java 实现ip地址分类并排序
小女子为了谋生,前几天参加华为实习生笔试,结果被虐惨了(小皮鞭都没这么痛!)。。。一共3道编程题,小女子就会一题(掩面而泣)。小女子不甘心啊,茶不思饭不想地就坐在电脑前想想想!!!(会不会精尽人亡 (°□°;) )终于啊,老天开眼了!!!灵感如潮水一阵一阵冲击着小女子,想明白其中一题!!!小女子满足了,欣慰。
今天要讨论的就是其中占一半分的大题——对ip地址进行分类排序。题目具体描述小女子已记不清了,但是核心就是给5个ip地址,对这5个ip地址进行分类(A,B,C,D,E),每个分类里面的ip地址按数字大小升序排列。
关于ip地址分类,网上查查就好了,有具体ip网段范围。
这里简单解释一下:
- A:0-127
- B : 128-191
- C : 192-223
- D : 224-239
- E : 240-255
最后输出形式
A:[50.1.1.1,117.1.1.2]
C:[192.168.1.1,202.101.1.1]
E:[245.210.1.2]
所以这题关键有两点:
- 排序
- 分类
排序
排序的思路是按字符串排序。肯定有人疑惑了50.1.1.1,117.1.1.2按字符串排序的话那前面一个比后面大,而实际上是后一个大。怎么办呢╮(╯▽╰)╭
这里参考很多对ip排序的,方法是对ip地址在前补零,再截取后3位,如:
原始ip | 补零ip | 截取ip |
---|---|---|
50.1.1.1 | 050.001.001.001 | 050.001.001.001 |
117.1.1.2 | 00117.001.001.002 | 117.001.001.002 |
这样不就可以完美的对处理后的ip地址进行字符串排序了嘛(•̀ᴗ•́)و ̑̑
java代码如下:
//补零
ip_str=ip_str.replaceAll("(\\d+)", "00$1");
//截取
ip_str=ip_str.replaceAll("0*(\\d{3})", "$1");
排序利用java集合treeset,省去好大一麻烦,完美!
分类
分类嘛,小女子就用了暴力解法(越暴力越开心)。截取ip地址第一个网段,判断数值大小,是哪类就添加到对应的stringbuffer里面去。
噢对,这里还要将之前处理的ip地址还原。客官不要急,代码如下:
StringBuffer sa