java 按ip排序_java 实现ip地址分类并排序

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 = new StringBuffer();

StringBuffer sb = new StringBuffer();

StringBuffer sc = new StringBuffer();

StringBuffer sd = new StringBuffer();

StringBuffer se = new StringBuffer();

for(String ip : s){

ip=ip.replaceAll("0*(\\d+)", "$1");

int type = Integer.parseInt(ip.substring(0, ip.indexOf(".")));

if(type>=1&&type<128) sa.append(ip+",");

if(type>=128&&type<192) sb.append(ip+",");

if(type>=192&&type<224) sc.append(ip+",");

if(type>=224&&type<240) sd.append(ip+",");

if(type>=240&&type<256) se.append(ip+",");

}

打印输出

有小可爱已经发现,append之后stringbuffer最后会多一个“,”,不要紧张,这里小女子会截掉这个多余的。

代码如下,就一句话la~

public static void printT(StringBuffer s,String type){

if(s.length()!=0){

System.out.println(type+":["+s.substring(0, s.lastIndexOf(","))+"]");

}

}

到这里,这题关键点都分析完了!有没有get到新姿势呢?。◕‿◕。

小女子全数送上完整的代码

import java.util.Set;

import java.util.TreeSet;

public class Main {

public static void printT(StringBuffer s,String type){

if(s.length()!=0){

System.out.println(type+":["+s.substring(0, s.lastIndexOf(","))+"]");

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

String ip_str = "192.168.1.1 50.1.1.1 117.1.1.2 202.101.1.1 245.210.1.2";

ip_str=ip_str.replaceAll("(\\d+)", "00$1");//补0

ip_str=ip_str.replaceAll("0*(\\d{3})", "$1");//截取后3位

//排序

String[] ip_sta = ip_str.split(" +");

Sets = new TreeSet();

for(String ip : ip_sta){

s.add(ip);

}

//分类

//5类ip存放stringbuffer

StringBuffer sa = new StringBuffer();

StringBuffer sb = new StringBuffer();

StringBuffer sc = new StringBuffer();

StringBuffer sd = new StringBuffer();

StringBuffer se = new StringBuffer();

for(String ip : s){

ip=ip.replaceAll("0*(\\d+)", "$1");

int type = Integer.parseInt(ip.substring(0, ip.indexOf(".")));//截取ip第一网段

if(type>=1&&type<128) sa.append(ip+",");

if(type>=128&&type<192) sb.append(ip+",");

if(type>=192&&type<224) sc.append(ip+",");

if(type>=224&&type<240) sd.append(ip+",");

if(type>=240&&type<256) se.append(ip+",");

}

//打印输出

printT(sa,"A");

printT(sb,"B");

printT(sc,"C");

printT(sd,"D");

printT(se,"E");

}

}

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

丹宇

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值