# 原创作品,转载请注明出处,谢谢!@杨福星
(http://blog.csdn.net/luckystar92/article/details)
一、题目介绍
【根据输入的IP信息库,查询特定某一IP所属位置】
二、分析
考虑运用顺序表存储数据
三、编程实现
MeiTu_Main .java
package companyTopic;
import java.util.Scanner;
/**
* 此类为顺序表 美图编程IP查询
*
* @author yangfuxing
*
*/
public class MeiTU_Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.print("请输入限定顺序表的最大长度:\t");
SLType SL = new SLType(sc.nextInt());
SL.SLInit(SL);
System.out.print("请输入需要录入的IP信息库的数据条数:\t");
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
DATA data = new DATA();
data.IP_start = sc.next();
data.IP_end = sc.next();
data.country = sc.next();
data.province = sc.next();
SL.SLAdd(SL, data);
}
System.out.println("信息库录入完毕,请开始查询:");
while (true) {
String ip = sc.next();
DATA data = SL.SLFindByKey(SL, ip);
if (data == null) {
System.out.println("未识别");
} else {
System.out.println(data.country + " " + data.province);
}
}
}
}
/**
* 定义节点
*
* @author yangfuxing
*
*/
class DATA {
/**
* 定义结点关键字
*/
String IP_start;
String IP_end;
String country;// 国家
String province;// 省份
}
/**
* 定义顺序表结构
*
* @author yangfuxing
*
*/
class SLType {
/**
* @param mAXLEN
*/
public SLType(int mAXLEN) {
super();
MAXLEN = mAXLEN;
ListData = new DATA[MAXLEN + 1];
}
/**
* 定义顺序表的最大长度
*/
int MAXLEN;
/**
* 保存顺序表的结构数组,数组下标从1开始至MAXLEN,下标0弃置不用
*/
DATA[] ListData;
/**
* 顺序表已存结点的数量
*/
int ListLen;
/**
* 初始化顺序表
*/
void SLInit(SLType SL) {
SL.ListLen = 0;// 初始化为空表
}
/**
* 计算顺序表元素的数量
*
* @return 元素数量:ListLen
*/
int SLLength(SLType SL) {
return (SL.ListLen);
}
/**
* 插入结点
*
* @param SL
* 顺序表
* @param n
* 结点序号
* @param data
* 结点元素
* @return boolean值:返回插入是否成功
*/
boolean SLInsertList(SLType SL, int n, DATA data) {
if (SL.ListLen >= MAXLEN) {// 顺序表结点数量已超过最大数量
System.out.print("顺序表已满,不能插入结点\n");
return false;
}
if (n < 1 || n > SL.ListLen) {// 插入结点序号不正确
System.out.print("插入结点序号不正确,不能插入结点\n");
return false;
}
for (int i = SL.ListLen; i >= n; i--) {
SL.ListData[i + 1] = SL.ListData[i];
}
SL.ListData[n] = data;
SL.ListLen++;
return true;
}
boolean SLAdd(SLType SL, DATA data) {
if (SL.ListLen >= MAXLEN) {
System.out.print("顺序表已满,无法追加!\n");
return false;
}
SL.ListData[++SL.ListLen] = data;
return true;
}
/**
* 根据序号i获取顺序表SL的节点元素
*
* @param SL
* :顺序表
* @param n
* :序号
* @return 序号i对应的节点
*/
DATA SLFindByNum(SLType SL, int n) {
if (n < 1 || n > SL.ListLen) {// 序号从1开始,DATA[0]弃置未用
System.out.print("输入序错误,不能返回结点\n");
return null;
}
return SL.ListData[n];
}
/**
* 通过关键字ip查找结点元素
*
* @param SL
* @param key
* @return
*/
DATA SLFindByKey(SLType SL, String ip) {
String[] str = ip.split("\\.");
for (int i = 0; i < 4; i++) {
if (str[i].length() < 3) {
String ss = "";
for (int j = 0; j < 3 - str[i].length(); j++) {
ss += "0";
}
str[i] = ss + str[i];
}
}
String s = str[0] + str[1] + str[2] + str[3];
long l = Long.valueOf(s);
DATA data = null;
for (int i = 1; i <= SL.ListLen; i++) {
String[] str1 = SL.SLFindByNum(SL, i).IP_start.split("\\.");
String s1 = str1[0] + str1[1] + str1[2] + str1[3];
long l1 = Long.valueOf(s1);
String[] str2 = SL.SLFindByNum(SL, i).IP_end.split("\\.");
String s2 = str2[0] + str2[1] + str2[2] + str2[3];
long l2 = Long.valueOf(s2);
if ((l >= l1) && (l <= l2)) {// find
data = SL.SLFindByNum(SL, i);
break;
}
}
return data;
}
}