黑马程序员技术交流社区

标题: 一个对IP进行排序的小程序,里面用到了一些基础知识点,和大家分享一下 [打印本页]

作者: LoveMyself    时间: 2015-5-17 22:14
标题: 一个对IP进行排序的小程序,里面用到了一些基础知识点,和大家分享一下

  1. import java.io.BufferedWriter;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.util.Arrays;

  5. /**
  6. * 3. 把以下IP存入一个txt文件,编写程序把这些IP按数值大小,从小到达排序并打印出来
  7. *    61.54.231.245
  8. *    61.54.231.9
  9. *    61.54.231.246
  10. *    61.54.231.48
  11. *    61.53.231.249
  12. */
  13. public class IpSort {
  14.         String[] str1;
  15.         public static void main(String[] args) {
  16.                 // 创建类对象
  17.                 IpSortTest ipst = new IpSortTest();
  18.                 // 调用类方法
  19.                 ipst.IpSortDemo();
  20.                 ipst.writerDemo();
  21.         }
  22. }
  23. class IpSortTest {
  24.         // 将IP写入IP.txt文件
  25.         String str = "61.54.231.245 61.54.231.9 61.54.231.246 61.54.231.48 61.53.231.249";

  26.         public void IpSortDemo() {
  27.                 // 声明StringBuffer容器
  28.                 StringBuffer sb = new StringBuffer();
  29.                 // 将由IP地址组成的字符串加上空格标记存入到str中
  30.                 String s4 = null;
  31.                 // 根据空格分割字符串
  32.                 String[] s = str.split(" ");
  33.                 // 遍历字符串数组
  34.                 for (String string : s) {
  35.                         String s1 = string;
  36.                         String s2;
  37.                         // 切割每个IP最后一个点后的字符
  38.                         s2 = s1.substring(s1.lastIndexOf(".") + 1);
  39.                         // System.out.println(s1);
  40.                         // 切割每个IP最后一个之前的字符
  41.                         String s3 = s1.substring(0, s1.lastIndexOf(".") - 1);
  42.                         // System.out.println(s3);
  43.                         // 判断切割出来的字符串,在其前补零
  44.                         if (s2.length() == 2) {
  45.                                 s2 = "0" + s2;
  46.                                 // System.out.println(s1);
  47.                         } else if (s2.length() == 1) {
  48.                                 s2 = "00" + s2;
  49.                                 // System.out.println(s1);
  50.                         }
  51.                         // 将字符串前后拼接起来
  52.                         s4 = s3 + "." + s2;
  53.                         // System.out.println(s4);
  54.                         // 用StringBuffer将拼接后的字符串接收
  55.                         sb.append(s4 + " ");
  56.                         // System.out.println(str1);
  57.                 }
  58.                 // 切割sb并加入数组
  59.                 String[] str1 = sb.toString().split(" ");
  60.                 // 排序
  61.                 Arrays.sort(str1);
  62.                 for (String str2 : str1) {
  63.                         // 用空字符替换IP中所有零
  64.                         String str3 = str2.replace("0", "");
  65.                         System.out.println(str3);
  66.                 }
  67.         }

  68.         public void writerDemo() {
  69.                 // 创建字符流对象
  70.                 // FileWriter fw = null;
  71.                 BufferedWriter bw = null;
  72.                 try {
  73.                         FileWriter fw = new FileWriter("d:\\IP.txt");
  74.                         // 将需要提高效率的流对象作为参数传递给缓冲区
  75.                         bw = new BufferedWriter(fw);
  76.                         bw.write(str);
  77.                         // 刷新
  78.                         bw.flush();
  79.                 } catch (Exception e) {
  80.                         e.printStackTrace();
  81.                 } finally {
  82.                         try {
  83.                                 bw.close();
  84.                         } catch (IOException e) {
  85.                                 e.printStackTrace();
  86.                         }
  87.                 }
  88.         }
  89. }
复制代码

作者: 王建伟    时间: 2015-5-17 22:51
牛叉:lol
作者: richaled    时间: 2015-5-18 08:02
这个用正则很快的
作者: LoveMyself    时间: 2015-5-18 09:20
richaled 发表于 2015-5-18 08:02
这个用正则很快的

正则我还没学会,所以就用了,自己知道的一些知识来完成:)
作者: 姬光普    时间: 2015-5-18 09:24
很清晰,受教了
作者: KK要有光    时间: 2015-5-18 09:33
这是我用正则表达式写的,可以看看。
  1. import java.io.BufferedWriter;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.util.TreeSet;

  5. /*
  6. * 3. 把以下IP存入一个txt文件,编写程序把这些IP按数值大小,从小到达排序并打印出来。
  7. * 61.54.231.245
  8. * 61.54.231.9
  9. * 61.54.231.246
  10. * 61.54.231.48
  11. * 61.53.231.249
  12. */
  13. public class Test3 {

  14.         public static void main(String[] args) throws IOException {
  15.                 ipToprint();

  16.         }
  17.         public static void ipToprint() throws IOException{
  18.                 BufferedWriter bufw=new BufferedWriter(new FileWriter("ip.txt"));
  19.                 String str="61.54.231.245 61.54.231.9 61.54.231.246 61.54.231.48 61.53.231.249";
  20.                 StringBuilder sb=new StringBuilder(str);
  21.                 ipsort(str);
  22.                 bufw.write(sb.toString());
  23.                 bufw.flush();
  24.                
  25.         }
  26.         //定义一个方法,对传入的IP地址进行排序
  27.         public static void ipsort(String ipstr){
  28.                 //每一段数字补两位零
  29.                 ipstr=ipstr.replaceAll("(\\d+)", "00$1");
  30.                 //每一段保留三位数字
  31.                 ipstr=ipstr.replaceAll("0*(\\d{3})", "$1");
  32.                 //1.将IP地址切出
  33.                 String[]ips=ipstr.split(" +");
  34.                 TreeSet<String>ts=new TreeSet<String>();
  35.                 for(String ip:ips){
  36.                         ts.add(ip);
  37.                 }
  38.                 for(String IP:ts){
  39.                         System.out.println(IP.replaceAll("0*(\\d+)", "$1"));
  40.                 }
  41.         }

  42. }
复制代码




作者: kingowe    时间: 2015-5-18 09:48
楼主很牛啊
作者: 王建伟    时间: 2015-5-18 09:48
建议楼主学习正则,毕老师视频里面就有。
另外在分析了一下楼主的代码给楼主一些建议,你的这段代码
  1. for (String str2 : str1) {
  2.                         // 用空字符替换IP中所有零
  3.                         String str3 = str2.replace("0", "");
  4.                         System.out.println(str3);
  5.                 }
复制代码

1、要想办法去掉的是无效的零而不是全部的零,不然如果是类似“010的”替换完成就成了“1”,这是有bug的;2、还有楼主的前面部分的切割如果也有一位或两位的字符,楼主也应该加一些判断,并把所使用的补零操作
嵌入进去,这样就能自由的对任意字段的一位或两位补零,以及进行下面的相关操作,希望对楼主有帮助。
3、还是去学学正则吧,比较简单,哈哈
作者: 彭越    时间: 2015-5-18 10:05
piaoguoaaaa
作者: LoveMyself    时间: 2015-5-18 10:20
KK要有光 发表于 2015-5-18 09:33
这是我用正则表达式写的,可以看看。

哎,感觉正则表达式省了不少事呀,我的太繁琐了,受教了
作者: LoveMyself    时间: 2015-5-18 10:24
王建伟 发表于 2015-5-18 09:48
建议楼主学习正则,毕老师视频里面就有。
另外在分析了一下楼主的代码给楼主一些建议,你的这段代码

我的小程序正如你所说,存在很大的局限性,只能用在这道题上,你分析的很透彻呀,后面一定要学学正则!
作者: 王先荣    时间: 2015-5-18 11:34
好多牛人啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2