繁体   English   中英

将 String 更改为 Int 以便更好地对其进行排序是否合法?

[英]Is it legitimate to change a String to Int so that I can sort it better?

我有很多字符串,例如 ("a32ghS:SAD"),我需要对它们进行排序。 像这样获得 integer 值是否可以:

String s = "a32ghS:SAD";
int l = 0;
for (int i = 0; i < s.length(); i++) {
    l += (int) s.charAt(i);
}

是否可以根据 integer l 对字符串进行排序? 或者我应该根据它的字符串对它们进行排序吗?

很大程度上取决于你想做什么。 :)

但是,如果您根据字符串对其进行排序,您将执行 O(NlogN) string2int 转换。 相反,如果您在排序之前转换字符串,您将只进行 O(N) 次转换。

简单地将每个字符的字符值相加会导致错误排序(假设您想要按字母顺序排列)。 考虑字符串"aZZZZ" ,这将在您的代码示例中出现在"b"之后。 您的方法将根据字符串中包含的字符的字符代码的总和对字符串进行排序,这不是特别有用。

假设你想按字母顺序排序,你应该使用 Java 库方法Collections.sort来完成它,因为已经编写了代码来执行此操作。

ArrayList<String> list = new ArrayList<String>();

unsortList.add("cc");
unsortList.add("bb");
unsortList.add("dd");
unsortList.add("aa");

Collections.sort(list);

典型的字母排序的工作方式是比较第一个 position 中的 ASCII 字符代码并以这种方式对它们进行排序,如果字符相同,则考虑下一个字符,依此类推。

除非您以特定方式排序,否则您将无法击败这种性能,或者您可以利用您所知道的关于字符串的一些知识。

这将使"a32ghS:SAD""S32gha:SAD"具有相同的 integer 表示。 另外,将整数转换回字符串会遇到麻烦(您必须使用一些 map 结构)。

所以,答案只是对字符串进行排序,并不是说它真的很慢(当然,这取决于项目的数量)。

不,因为字符串中的 position 很重要(请参阅上面的答案)但是如果您知道字符串的最大长度,并且如果在添加字符后对其进行位移,则可能没问题。

请记住,String.compareTo 以几乎相同的方式使用每个字符的 unicode 值,但 compareTo 方法默认区分大小写。

在 Cassandra 数据库中,他们默认执行类似的操作。 然而,为了计算 integer,他们使用 murmur3 计算了 hash。 hash 类似于您的简单总和,但您不太可能找到两个具有相同 hash 的字符串(它们存在,只是很少见)。

在这种情况下,它很有用,因为您计算一次 hash 并可能搜索数百万行。 它使它变得非常快,因为 hash 允许对搜索进行分片(即,如果您有 201 台计算机并使用 3 台计算机为一组来保存数据 [用于复制],那么搜索 10,000,000 行的数据库意味着在其中一台上搜索大约 149,253 行这些小簇)。

请注意,结果字符串未按字母顺序排序。

现在,要对 memory 中的字符串进行排序,您可能只想使用sort()并将字符串本身作为键。 计算 hash 的时间,存储它,它使用的额外 memory,你不可能保存任何东西。 标准排序将使用二进制搜索,因此对于 1,000,000 个字符串最多需要 10 到 11 次迭代。 它会很快。

在 Java 中,如果需要将数据附加到字符串中,请使用Map 如果您不需要任何数据,请使用SortedSet

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM