我想按升序排序IP地址列表,最简单的方法是什么?
例如,我在List
:
import java.util.ArrayList;
import java.util.List;
/**
*
* @author myu
*/
public class SortListProject {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
List addressList = new ArrayList();
addressList.add("192.168.0.5");
addressList.add("192.168.0.1");
addressList.add("192.168.25.1");
addressList.add("192.168.10.21");
addressList.add("192.168.77.1");
System.out.println(addressList);
}
}
我想用以下输出对列表进行排序:
{192.168.0.1, 192.168.0.5, 192.168.10.21, 192.168.25.1, 192.168.77.1}
答案 0 :(得分:2)
您正在使用原始类型。请不要这样做。接下来,您需要解析String
表示以从IP中的四个八位字节中获取int
值(或192.168.100.1将在192.168.2.1之前得到)。您可以将自定义Comparator
传递给Collections.sort
。假设您使用的是Java 8+,它们可能看起来像
List<String> addressList = new ArrayList<>(Arrays.asList("192.168.0.5", //
"192.168.0.1", "192.168.25.1", "192.168.10.21", "192.168.77.1"));
Collections.sort(addressList, (a, b) -> {
int[] aOct = Arrays.stream(a.split("\\.")).mapToInt(Integer::parseInt).toArray();
int[] bOct = Arrays.stream(b.split("\\.")).mapToInt(Integer::parseInt).toArray();
int r = 0;
for (int i = 0; i < aOct.length && i < bOct.length; i++) {
r = Integer.compare(aOct[i], bOct[i]);
if (r != 0) {
return r;
}
}
return r;
});
System.out.println(addressList);
答案 1 :(得分:1)
您可以使用{"box_background_color":"red","box_text_color":"white","test3_var2":3,"name":"test name","email":"email@email.com","box_border_color":"orange"}
box_background_color::::red
box_text_color::::white
test3_var2::::3
name::::test name
email::::email@email.com
box_border_color::::orange
TestClass1 [_name=test name, _emailAddress=email@email.com, innerClass=TestClass2 [_boxBackgroundColor=red, _boxBorderColor=orange, _boxTextColor=white], innerClass2=TestClass3 [_test3Var1=null, _test3Var2=3]]
进行排序,例如:
Collections.sort
<强>输出:强>
List<String> addressList = new ArrayList<>();
addressList.add("192.168.0.5");
addressList.add("192.168.0.1");
addressList.add("192.168.25.1");
addressList.add("192.168.10.21");
addressList.add("192.168.77.1");
Collections.sort(addressList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
String[] ip1 = o1.split("\\.");
String ipFormatted1 = String.format("%3s.%3s.%3s.%3s", ip1[0],ip1[1],ip1[2],ip1[3]);
String[] ip2 = o2.split("\\.");
String ipFormatted2 = String.format("%3s.%3s.%3s.%3s", ip2[0],ip2[1],ip2[2],ip2[3]);
return ipFormatted1.compareTo(ipFormatted2);
}
});
System.out.println("sorted: " + addressList);
答案 2 :(得分:1)
正确的方法是使用comparator
和generics
(如前所述)。请注意,接受输入数据的谬误完全取决于您的期望。例如,在IP的情况下:Java Socket API接受127.0.0.1
和127.0.0.01
。但是你所写的那种也应该考虑到这些因素。因此,我建议您使用基于IP地址的字节(八位字节)的排序。
有很多例子可以做到,我不会这样做。一个简单的搜索将引导您到这个网站上的一个。
我要做的是证明需要按八位字节排序:
byte[] ipAddr1 = new byte[] { x1, x2, (byte) 010, x4 };
byte[] ipAddr2 = new byte[] { x1, x2, 9, x4 };
InetAddress addr = InetAddress.getByAddress(ipAddr1);
InetAddress addr = InetAddress.getByAddress(ipAddr2);
这两个都被Java Socket库接受,但没有报告任何错误。它们都可以工作,但是如果你在不考虑单个八位字节的情况下对它进行排序(例如进行字符串排序),那么结果可能不是你所期望的。试一试,看看。
例如(如果您遵循Collections.sort(list)
方法):如果您有:“192.160.010.1”和“192.160.9.1”。你会看到前者看起来比后者少,但事实并非如此。原因是这将基于字符串进行排序。这与IP地址的结构无关。
答案 3 :(得分:0)
您可以通过多种方式对List进行排序,其他答案可以为其提供解决方案。但是,您应该退后一步,考虑一下您对列表的实际操作。
列表是原始类型,没有什么可以阻止任何人添加任何类型的对象。你总是使用泛型并避免使用原始类型。
List<String> addressList = new ArrayList<>();
答案 4 :(得分:0)
以下是使用Guava Ordering
实用程序的解决方案:
addressList.sort(Comparator.comparing((String s) -> Arrays.asList(s.split("\\.")),
Ordering.natural().<String>onResultOf(Integer::parseInt).lexicographical()));
答案 5 :(得分:0)
import java.util.*;
public class Main{
public static void main(String[] args){
List<String> addressList = new ArrayList<String>();
addressList.add("192.1.1.100");
addressList.add("192.1.10.1");
addressList.add("192.100.10.1");
addressList.add("192.100.10.10");
Collections.sort(addressList,(a,b) ->{
int[]aOct = Arrays.stream(a.split("\\.")).mapToInt(Integer:: parseInt).toArray();
int[]bOct = Arrays.stream(b.split("\\.")).mapToInt(Integer:: parseInt).toArray();
int r = 0;
for (int i = 0; i<aOct.length && i< bOct.length; i++){
if(r !=0){
return r;
}}
return r;
});
System.out.println(addressList);
}}