按字母顺序对其中包含数字的字符串进行排序

时间:2019-04-16 07:14:53

标签: java sorting

我对Java编程/算法问题还很陌生,我无法弄清这种排序算法。

因此,假设我在数组或arraylist中有多个String元素。

"She ate 10 eclair"
"She ate 99 donuts"
"She had 20 eclair"
"She had 10 eclair"

当我对这些字符串进行排序时,算法问题要求我跳过数字并首先按字母顺序对其进行排序。像这样:

"She ate 99 donuts"
"She ate 10 eclair"
"She had 10 eclair"
"She had 20 eclair"

因此,当我使用常规的Collections.sort()compareTo()方法时,这些字符串中包含数字。我很难用这种排序算法来构建逻辑。

我研究了自然排序方法,但是由于我很新,因此我不确定自己是否走对了路。

那么我要按字符比较此字符并检查当前索引是否为数字?还是我将每个char转换为十六进制值并比较类似的字符串?

java是否提供任何可以帮助我解决这种分离的方法?

我们将不胜感激任何帮助,指导,文档,摘要。

致谢。

3 个答案:

答案 0 :(得分:2)

您可以在Collections.sort()方法中提供一个比较器,该方法将对输入字符串中的任何数字进行排序:

List<String> list = ... ; //your list
Collections.sort(list, (a, b) -> a.replaceAll("[\\d]", "").compareTo(b.replaceAll("[\\d]", "")));

答案 1 :(得分:1)

通常用于排序的是人工排序键。

要使连续的数字映射到同一符号,可以这样做:

private String sortKey(String s) {
    return s.replaceAll("\\d+", "0");
}

将10和99都替换为0。

正则表达式:

  • \\d位数字
  • 后缀运算符+:一个或多个

答案 2 :(得分:0)

  1. 将字符串列表转换为自定义对象列表。每个自定义对象都将包含对相应原始字符串的引用。
  2. 使用自定义Comparator对第二个列表进行排序。
  3. 将第二个列表转换回字符串列表(通过提取原始字符串)。

自定义对象将由以下内容组成:

  • 对原始字符串的引用
  • 修改后的字符串(例如数字替换为“%”)
  • 数字(或数字列表)

自定义Comparator仅将使用修改后的字符串和数字进行比较。