Java:棘手的前缀字符串排序(ArrayLists)

标签 java string sorting arraylist split

(不需要任何网络知识。这纯粹是字符串和列表)。

假设我有一个函数,它接受字符串 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 之一,不必交替)并创建一个干净的数组以传递给排序函数时,我丢失了前缀信息。我想要的是以下类型的输出:

e4.5.6.7, f8.8.8.8, e146.144.111.6, e192.168.1.1, f244.244.244.244

基本上,在排序之前,无论未排序列表中每个元素的前缀是什么,都需要将相同的前缀添加回已排序列表中的元素。

注意事项:

  • 一个IP地址可以在原始列表中重复,最多重复两次
  • 当重复两次时,保证两个元素中的每一个都具有相同的前缀
  • 排序算法不会删除重复项。

请提供一些算法方面的帮助? (请记住,我们已经有一个可以对干净的 IPv4 字符串数组列表进行排序的函数)。

最佳答案

在将前缀传递给排序函数之前,不要删除前缀。相反,在 sortListOfIpv4s方法,始终使用 s.substring(1) 比较字符串,这将为您提供不带前缀的整个字符串,并添加 s到生成的排序数组。

如果sortListOfIpv4s是一个黑盒,您需要传递无前缀的字符串,然后您可以预先将前缀缓存在Map 中。来自 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 中排序并恢复前缀:

List<String> sortedIPV4s = sortListOfIpv4s(unsortedIPv4s);
for (String ip : sortedIPV4s) {
  String prefix = prefixMap.get(ip);
  String originalIp = prefix + ip;
}

关于Java:棘手的前缀字符串排序(ArrayLists),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12134681/

相关文章:

java - 如何使用 BeanUtils 自省(introspection)获取 Java 对象的所有属性列表?

c# - 我是否需要 2 Comparer<T> 进行双向排序?

javascript - 排序 javascript 挂起

java - 如何访问 Spring Bean 名称?

java - GSON "NoClassDefFoundError com/google/gson/Gson"

php - 如何检查 PHP 中的每个字符是否都是字母数字?

javascript - 字符串中棘手的多次替换

R排列向量列表

java - Hadoop 工作依赖性与分布式的旧工作依赖性发生冲突

python - 在 python 2.7 中删除之前和包括 _ 的字符