【问题标题】:Sorting strings alphabetically that have digits in them按字母顺序对包含数字的字符串进行排序
【发布时间】:2019-04-16 07:14:53
【问题描述】:

我对 Java 中的编程/算法问题非常陌生,但我无法弄清楚这种排序算法。

假设我在一个数组或数组列表中有多个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() 方法时,它会在这些字符串中包含数字。我很难从这种排序算法中构建逻辑。

我已经研究过自然排序方法,但我不确定我是否走在正确的轨道上,因为我是新手。

那么我要对每个字符进行比较并检查当前索引是否为数字吗?还是我要将每个字符转换为十六进制值并像这样比较字符串?

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

任何帮助、指导、文档、sn-p 将不胜感激。

问候。

【问题讨论】:

  • 如果一个字符串中有一个数字而另一个字符串的对应位置有一个字母会怎样?
  • 我会首先找到一种将字符串转换为不带数字的方法。
  • @AndyTurner 喜欢:“Er1”和“E2r”?
  • @interstellar 类似的东西,或者如果我们使用你的情况更像是“她有 20 个泡芙”和“她嚼了 99 个甜甜圈”。

标签: java sorting


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    为了进行排序,通常会派生一个人工排序键。

    为了将连续数字映射到相同的符号,可以这样做:

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

    这会将 10 和 99 都替换为 0。

    正则表达式:

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

    【讨论】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多