代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 本文基本思想是冒泡排序;
* 相比数字数组的冒牌排序,不同的只是比较大小的方式;
* 利用group()方法获取每一段数字然后再比较;
*
*/
public class IpSort {
public static void main(String[] args) {
IpSort iS = new IpSort();//new一个对象用来调用print方法和sort方法;
String[] ip = { "192.168.1.1", "127.0.0.1", "127.2.3.4", "192.169.1.1" };//定义数组
System.out.println("排序前:");
iS.print(ip);
iS.sort(ip);
System.out.println("排序后:");
iS.print(ip);
}
public void print(String[] ip) {//此方法输出数组
for (int i = 0; i < ip.length; i++) {
System.out.println(ip[i]);
}
}
public void sort(String[] ip) {//此方法对数组排序
Pattern p = Pattern.compile("([0-9]{1,3})");//正则
for (int i = 0; i < ip.length - 1; i++) {//此处两行for循环为冒泡排序
for (int j = 0; j < ip.length - i - 1; j++) {
Matcher m = p.matcher(ip[j]);
Matcher n = p.matcher(ip[j + 1]);
while (m.find() && n.find()) {//如果ip[j],ip[j + 1]都能找到组符合正则的字符串;没执行一次下一次会自动寻找下一个符合的字符串
if (Integer.parseInt(m.group(0)) > Integer.parseInt(n.group(0))) {//字符串强转为int类型;
//如果ip[j]当前获取的字符串比ip[j + 1]当前获取的字符串大,则交换位置,并且结束当前while循环;
String temp = ip[j];
ip[j] = ip[j + 1];
ip[j + i] = temp;
break;
}
}
}
}
}
}
运行截图:
如果不想用包装类强转String类的话也可以这样:
while (m.find() && n.find()) {// 如果ip[j],ip[j + 1]都能找到组符合正则的字符串;没执行一次下一次会自动寻找下一个符合的字符串
String a = m.group().replaceAll("(.+)", "00$1");
a = a.replaceAll("0*(\\d{3})", "$1");
String b = n.group().replaceAll("(.+)", "00$1");
b = b.replaceAll("0*(\\d{3})", "$1");
if (a.compareTo(b) > 0) {// 如果ip[j]当前获取的字符串比ip[j +
// 1]当前获取的字符串大,则交换位置,并且结束当前while循环;
String temp = ip[j];
ip[j] = ip[j + 1];
ip[j + i] = temp;
break;
}
}