(无需任何网络知识。这纯粹是字符串和列表。)
假设我有一个函数,一个接受String IPv4点缀地址列表的函数,并按升序对它们进行排序。 (不是按字母顺序排列的,真正的ip长格式排序)。我们称之为:
public static ArrayList<String> sortListOfIpv4s(ArrayList<String> unsortedIPv4s);
此功能已正常运行。给出一个输入:
192.168.1.1, 8.8.8.8, 4.5.6.7, 244.244.244.244, 146.144.111.6
它将输出列表:
4.5.6.7, 8.8.8.8, 146.144.111.6, 192.168.1.1, 244.244.244.244
(我们不讨论它是否应该修改列表或返回一个新列表。它只返回一个新列表。此外,由于种种原因,该函数无法修改。)
但是,我的输入列表如下所示:
e192.168.1.1, f8.8.8.8, e4.5.6.7, f244.244.244.244, e146.144.111.6
当我删除前缀(只有e或f中的一个,非NECESSARILY交替)并创建一个干净的数组以传递给排序函数时,我丢失了前缀信息。我想要的是类型的输出:
e4.5.6.7, f8.8.8.8, e146.144.111.6, e192.168.1.1, f244.244.244.244
基本上,在排序之前,未排序列表中的每个元素都有前缀,需要将相同的前缀添加回排序列表中的元素。
注意事项:
请问一点算法帮助? (请记住,我们已经有了一个可以对干净的IPv4 String arraylists进行排序的函数。)
答案 0 :(得分:2)
在将前缀传递给排序功能之前,请勿删除前缀。相反,在sortListOfIpv4s
方法中,始终使用s.substring(1)
比较字符串,这将为您提供不带前缀的整个字符串,并将s
添加到生成的排序数组中。
如果sortListOfIpv4s
是黑匣子并且您需要传递无前缀的字符串,那么您可以事先将Map
中的前缀缓存到{{1} }}:
prefix-free IP -> prefix
然后从Map<String, String> prefixMap = new HashMap<String, String>();
for (String ip : unsortedIPv4s) {
prefixMap.put(ip.substring(1), ip.substring(0, 1));
}
:
Map
答案 1 :(得分:0)
您的方法可以将任何前缀移动到字符串的末尾,对列表进行排序,然后再次遍历字符串并将前缀从末尾移回到开头。
答案 2 :(得分:0)
您可以实施比较器:
public class IpComparator implements Comparator<String> {
@Override
public int compare(String ipA, String ipB) {
return doComparison( ipA.substring(1), ipB.substring(1) );
}
}
然后你可以使用它:
return Collections.sort(unsortedIPv4s, new IpComparator());