Вы храните IP-адреса как String
экземпляры? Вероятно, это так, потому что String
отсортированы лексикографически, что означает "10" < "2"
.
Если вы хотите отсортировать их численно, есть несколько способов:
- Вместо того, чтобы поместить их в
List<String>
, поместите их в List<Integer>
- или, может быть, даже
SortedSet<Integer>
- Сохраните
List<String>
, но предоставьте собственный компаратор, который преобразует String
в числовое значение для сравнения.
- может быть не самым эффективным, но работает без существенных изменений в существующей инфраструктуре
- хотя, возможно, серьезные изменения неплохи для начала ...
Вот пример, который объединяет немного обоих в один:
import java.util.*;
public class IPSorter {
static Long toNumeric(String ip) {
Scanner sc = new Scanner(ip).useDelimiter("\\.");
return
(sc.nextLong() << 24) +
(sc.nextLong() << 16) +
(sc.nextLong() << 8) +
(sc.nextLong());
}
public static void main(String[] args) {
Comparator<String> ipComparator = new Comparator<String>() {
@Override public int compare(String ip1, String ip2) {
return toNumeric(ip1).compareTo(toNumeric(ip2));
}
};
SortedSet<String> ips = new TreeSet<String>(ipComparator);
ips.addAll(Arrays.asList(
"192.168.0.1", "192.168.0.250", "192.168.0.9", "9.9.9.9"
));
System.out.println(ips);
// "[9.9.9.9, 192.168.0.1, 192.168.0.9, 192.168.0.250]"
}
}
API ссылки