java 对IP地址进行排序,或类ip地址的字符串进行排序
排序前先认识一下这个拆分字符串非常好用的类
1.StringTokenizer类
1.1 构造方法
StringTokenizer(String str) :构造一个用来解析 str 的 StringTokenizer 对象。java
默认的分隔符是空格(“”)、制表符(\t)、换行符(\n)、回车符(\r)。
StringTokenizer(String str, String delim) :构造一个用来解析 str 的
StringTokenizer 对象,并提供一个指定的分隔符(可以传入多个特殊字符)。
StringTokenizer(String str, String delim, boolean returnDelims)
:构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。
1.2 常用方法
- int countTokens():返回nextToken方法被调用的次数。
- boolean hasMoreTokens():返回是否还有分隔符。
- boolean hasMoreElements():判断枚举 (Enumeration) 对象中是否还有数据。
- String nextToken():返回从当前位置到下一个分隔符的字符串。
- Object nextElement():返回枚举 (Enumeration) 对象的下一个元素。
- String nextToken(String delim):与 4 类似,以指定的分隔符返回结果。
2. 遇到的排序问题
2.1 问题
首先是要去查询一个目录,将类似于下面这种文件名(ip地址+下划线+端口号)全查出来放到一个集合中,最后传到前端去展示,不过要求进行排序展示。
2.2 思路
其实就是将ip地址和后面的端口号比较就好,将ip地址和端口统统拆分开比较就行,拆分用split()会比较多,但是这个用在这里就不方便了。用StringTokenize就很方面在这个场景下。
2.3 方法
public static void main(String args[]){
List<String> list = Arrays.asList(
"192.168.1.2_1.txt",
"10.10.22.33_1.txt",
"127.1.1.1_3.txt",
"127.1.1.1_3.txt",
"192.168.22.11_2.txt",
"111.1.1.2_3.txt"
);
//这里用流来进行排序
// List<String> collect =
list.stream().sorted((e1, e2) -> {
//这里用.划分开ip地址,用_划分出端口号
StringTokenizer token = new StringTokenizer(e1, "._");
StringTokenizer token2 = new StringTokenizer(e2, "._");
//表里
while (token.hasMoreTokens() && token2.hasMoreTokens()) {
//变成整形进行比较
int parseInt = Integer.parseInt(token.nextToken());
int parseInt2 = Integer.parseInt(token2.nextToken());
if (parseInt > parseInt2) {
return 1;
}
if (parseInt < parseInt2) {
return -1;
}
if (token.nextToken()=="txt"){
return -1;
}
}
//e1还有值,则e2已遍历完
if (token.hasMoreElements()) {
return 1;
} else {
return -1;
}
})..forEach(System.out::println);
}
排序结果