现在有一个List<String>的IP地址
221.226.83.50
221.226.83.51
221.226.83.52
221.226.83.53221.226.83.61
221.226.83.62
221.226.83.63
221.226.83.64
。
要写一个算法:
返回成分段的List(“221.226.83.50-221.226.83.53”,“221.226.83.61-221.226.83.64”)大虾们帮帮忙
221.226.83.50
221.226.83.51
221.226.83.52
221.226.83.53221.226.83.61
221.226.83.62
221.226.83.63
221.226.83.64
。
要写一个算法:
返回成分段的List(“221.226.83.50-221.226.83.53”,“221.226.83.61-221.226.83.64”)大虾们帮帮忙
二、逐个IP【0——lastIndexOf(".")】之间的字符串进行匹配
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("221.226.83.9");
list.add("221.226.83.10");
list.add("221.226.83.11");
list.add("221.224.83.53");
list.add("221.224.83.52");
list.add("221.226.87.21");
list.add("221.226.87.22");
Set<String> set = new TreeSet<String>(new Comparator<String>(){
public int compare(String arg0, String arg1){
String[] key1 = arg0.split("\\.");
String[] key2 = arg1.split("\\.");
for(int i= 0;i<key1.length;i++){
if(Integer.parseInt(key1[i]) == Integer.parseInt(key2[i])){
continue;
}
if(Integer.parseInt(key1[i]) > Integer.parseInt(key2[i])){
return 1;
}
if(Integer.parseInt(key1[i]) < Integer.parseInt(key2[i])){
return -1;
}
}
return 0;
}});
set.addAll(list);
System.out.println(set);
List<String> result = new ArrayList<String>();
String s1 = null;
String s2 = null;
String start = null;
String end = null;
int count = 0;
for(String s : set){
count ++;
if(s1==null){
s1 = s;
start = s;
}
else{
s2 = s;
if(s2.startsWith(s1.substring(0,s1.lastIndexOf(".")))&&
Integer.parseInt(s2.substring(s2.lastIndexOf(".")+1))
- Integer.parseInt(s1.substring(s1.lastIndexOf(".")+1)) == 1){
end = s;
s1 = s2;
}
else{
result.add(start + (end==null?"":"-"+end));
s1 = s;
start = s;
end = null;
}
if(count == set.size()){
result.add(start+ (end==null?"":"-"+end));
s1=null;
end =null;
}
}
}
System.out.println(result);
}
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class Test03 {
private static List<String> IP_LIST = new ArrayList<String>();
static {
IP_LIST.add("221.226.83.50");
IP_LIST.add("221.226.83.51");
IP_LIST.add("221.226.83.52");
IP_LIST.add("221.226.83.53");
IP_LIST.add("221.226.83.54");
IP_LIST.add("221.226.83.55");
IP_LIST.add("221.226.83.61");
IP_LIST.add("221.226.83.62");
IP_LIST.add("221.226.83.63");
IP_LIST.add("221.226.83.64");
IP_LIST.add("221.226.83.75");
IP_LIST.add("221.226.83.255");
IP_LIST.add("221.226.84.1");
IP_LIST.add("221.226.84.2");
IP_LIST.add("221.226.84.3");
IP_LIST.add("221.226.85.4");
} public static void main(String[] args) {
List<String> list = getIPList(IP_LIST);
for (String str : list) {
System.out.println(str);
}
} public static List<String> getIPList(List<String> ipList) {
Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();
for (String ip : ipList) {
int index = ip.lastIndexOf('.');
String ip123 = ip.substring(0, index + 1);
int ip4 = Integer.valueOf(ip.substring(index + 1, ip.length()));
if (map.containsKey(ip123)) {
map.get(ip123).add(ip4);
} else {
List<Integer> ip4List = new ArrayList<Integer>();
ip4List.add(ip4);
map.put(ip123, ip4List);
}
} List<String> list = new ArrayList<String>();
for (Map.Entry<String, List<Integer>> entry : map.entrySet()) {
String ip123 = entry.getKey();
List<Integer> ip4List = entry.getValue();
Collections.sort(ip4List);
int len = ip4List.size();
for (int i = 0; i < len; i++) {
int start = ip4List.get(i);
int stop = start; while (++i < len) {
int current = ip4List.get(i);
if (current == (stop + 1)) {
stop = current;
} else {
list.add(start == stop ? ip123 + String.valueOf(start)
: ip123 + String.valueOf(start) + "-" + ip123
+ String.valueOf(stop));
i--;
break;
}
} if (i >= len) {
list.add(start == stop ? ip123 + String.valueOf(start)
: ip123 + String.valueOf(start) + "-" + ip123
+ String.valueOf(stop));
}
}
}
return list;
}
}结果:
221.226.83.50-221.226.83.55
221.226.83.61-221.226.83.64
221.226.83.75
221.226.83.255
221.226.84.1-221.226.84.3
221.226.85.4
list.add("221.226.83.9");
list.add("221.226.83.10");
9会排在10前面,所以加了一个comparator比较。