【发布时间】:2017-02-08 13:08:14
【问题描述】:
我正在尝试按每个字符出现的次数对字符串进行排序,最常见的出现在开头,最稀有的出现在结尾。排序后,我需要删除所有重复的字符。因为示例总是更清晰,所以程序应该执行以下操作:
String str = "aebbaaahhhhhhaabbbccdfffeegh";
String output = sortByCharacterOccurrencesAndTrim(str);
在这种情况下,'sortByCharacterOccurrencesAndTrim' 方法应该返回:
String output = "habefcdg"
在 2 个字符出现相同的情况下,它们在返回字符串中的顺序无关紧要。所以“habefcdg”也可以等于“habfecgd”,因为“f”和“e”都出现了3次,而“d”和“g”都出现了一次。
"habefcdg" would effectively be the same as "habfecgd"
注意:我想指出,在这种情况下,性能很重要,所以我希望尽可能采用最有效的方法。我这样说是因为字符串长度可以从 1 到最大长度(我认为与 Integer.MAX_VALUE 相同,但不确定),所以我想尽量减少任何潜在的瓶颈。
【问题讨论】:
-
字符集是否有限?
-
如果字符串太大,那么在性能方面使用地图将是一个不错的选择,因为地图可以在哈希码的帮助下轻松排序。
-
请定义“不合理的时间量”。我可以在 ~215ms 中使用映射处理 100,000,000 个字符的字符串。使用数组作为suggested by Jim Mischel,需要~48ms。将 Streams 用作 suggested by Óscar López 需要 ~1250ms。在我看来,即使是相对较慢的 Stream 解决方案也不会花费“不合理的时间”。
-
您的字符串是否可能包含亚洲语言?如果是这样,请注意您不能独立处理 Java 字符;您需要考虑代理对并允许超过 65k 的不同字符,这使得基于数组的解决方案不切实际。
-
@MichaelBorgwardt:即使考虑到非 BMP 代码点,Unicode 代码点的总数也只有 65k 的 17 倍——我想说数组解决方案仍然可行。
标签: java string performance sorting