A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.net.*;
import java.io.*;
import java.util.*;

/*
* 第17题:把以下IP存入一个txt文件,编写程序把这些IP按数值大小,从小到达排序并打印出来。
* 61.54.231.245
* 61.54.231.9
* 61.54.231.246
* 61.54.231.48
* 61.53.231.249
* txt存储,读取并排序打印
* */
public class Test17 {
public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub
  FileWriter fw=new FileWriter("D:\\java0204\\ip.txt");
  
  fw.write("61.54.231.245"+"\r\n");
  fw.write("61.54.231.9"+"\r\n");
  fw.write("61.54.231.245"+"\r\n");
  fw.write("61.54.231.48"+"\r\n");
  fw.write("61.54.231.249"+"\r\n");
  
  fw.close();
  BufferedReader bufr=new BufferedReader(new FileReader("D:\\java0204\\ip.txt"));
  //定义一个字符串数组用来存储ip字符串
  String[] strs=new String[5];
  //i是字符串数组的角标,j是两个字符串的第一轮比较结果
  int i=0,j;
  
  for(String line=null;(line=bufr.readLine())!=null;)
  {
   strs[i++]=line;
  }
  //冒泡排序
  for(int m=0;m<strs.length-1;m++)
  {
   for(int n=0;n<strs.length-m-1;n++)
   {
    //这里如果两个ip字符串相等就不需要比较了
    j=strs[n].compareTo(strs[n+1]);
    //如果两个ip字符串不相等就比较
    if(j!=0)
    {
     //比较两个ip字符串的数值形态的大小
     if(compareIP(strs[n],strs[n+1])>0)
      swap(strs,n,n+1);
    }
   }
  }
  //将比较后的ip数组打印出来
  for(int x=0;x<strs.length;x++)
  {
   System.out.println(strs[x]);
  }
}
//自定义比较ip值的方法
public static int compareIP(String str1,String str2)
{
  int num=0,result=0,count=0,subValue1,subValue2;
  while(num<15)
  {
   //这是个计数器,用来记住“.”的个数和比较次数
   count++;
   //到第三个点或者说第三次的时候,换种方式取得ip四位数的最后一个数值
   if(count==3)
   {
    subValue1=Integer.parseInt(str1.substring(str1.lastIndexOf(".")+1, str1.length()));
    subValue2=Integer.parseInt(str2.substring(str2.lastIndexOf(".")+1, str2.length()));
   }else{
    subValue1=Integer.parseInt(str1.substring(num, str1.indexOf(".",num)));
    subValue2=Integer.parseInt(str2.substring(num, str2.indexOf(".",num)));
   }
   //如果取得的ip四个数中刚开始都是相等的,就继续取
   if(subValue1==subValue2)
   {
    num+=str1.indexOf(".",num);
    num+=count;
   }
   else if(subValue1>subValue2)
   {
    result=1;
    break;
   }
   else
   {
    result=-1;
    break;
   }
  }
  return result;
}

public static void swap(String[] strs,int n,int m)
{
  String temp=strs[n];
  strs[n]=strs[m];
  strs[m]=temp;
}
}
下面附上程序运行结果:

整了一晚上,整的我头都晕了--、,之前想过用TreeSet集合和Arrays来比较,但是都不是想要的结果,最后我只好把ip地址值分解,一个数一个数比较。

3 个回复

倒序浏览
程序哪里需要改进的地方求大家提点!争取优化到最好。
回复 使用道具 举报
首先我会把IP地址抽象为一个类。这个类中,我会用String数组来存储ip地址中被点分隔的各个部分。构造函数中用String的split方法可以把"61.123.11.9"这种字符串分隔为四个子字符串,存入String数组。

为了比较IP地址,IP类可以设计为具备比较性,也就是实现Comparable接口。由于已将IP地址分段存储,compareTo方法的重写就变得很简单——分段将字符串转为int后比较
回复 使用道具 举报
我们还没有学那么多知识,不过感觉师哥好厉害!帮顶
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马