【问题标题】:Sorting strings of letters, numbers, and special characters对字母、数字和特殊字符的字符串进行排序
【发布时间】:2020-11-13 18:22:01
【问题描述】:

我有一个要按特定顺序排序的字符串列表。

列表是 ["Bea", "hel", "Hel", "--'", "813", "!@#", "813", "813", "Alb"]

我想让它排序如下:

[813, 813, 813, --', !@#, Alb, Bea, Hel, hel]

我有一些非常接近的代码,但仍然有一个我无法弄清楚的错误。目前该程序正在制作这个。

[813, 813, 813, Alb, --', !@#, Bea, Hel, hel]

下面是我目前拥有的代码

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Arrays;
import java.util.Comparator;


class Main {
  public static void main(String[] args) {
    List<String> list = Arrays.asList("Bea", "hel", "Hel", "--'", "813", "!@#", "813", "813", "Alb");

    Collections.sort(list, STANDARD_ALPHABETICAL_ORDER);
    System.out.println(list);

  }


  public final static Comparator<String> STANDARD_ALPHABETICAL_ORDER =
    (a,b) -> {
        String newA = a.replaceAll("[^a-zA-Z0-9]", "");
        String newB = b.replaceAll("[^a-zA-Z0-9]", "");
        int na = newA.length();
        int nb = newB.length();
        int r;
        int n;
        if (na < nb) {
            r = -1;
            n = na;
        } else if (na > nb) {
            r = -1;
            n = nb;
        } else {
            r = 0;
            n = na;
        }
        for (int i = 0; i < n; ++i) {
            char ca = newA.charAt(i);
            char cb = newB.charAt(i);
            if (ca != cb) {
                if (Character.isDigit(ca) && !Character.isDigit(cb)) {
                  return -1;
                } else if (!Character.isDigit(ca) && Character.isDigit(cb)) {
                  return 1;
                } else if (ca > cb ) {
                  return 1;
                } else {
                  return -1;
                }
            }
        }
        return r;
    };
}

【问题讨论】:

  • 您介意详细说明您的排序标准吗?
  • 当然,它是按字母数字排序的。忽略(但保留)非字母数字字符。数字在字母前,大写字母在小写字母前(即 0-9、A-Z、a-z)
  • 我总是将数据保存到笔记本文本文件中,然后将数据导入到 Excel 中。根据您的数据显示方式并假设您不想包含“,我将使用 delimited 与分隔符”放置另一个框。导入后,您可以将文件另存为 Excel 表格并删除不需要的列并按您的意愿排序。
  • 您可以考虑使用基于 Java 规则的整理器来定义您自己的自定义排序顺序。您可以查看一个示例(针对不同的自定义排序顺序)here
  • 我将创建一个具有字符串值和排序值的对象,并在构造时从字符串值生成排序值,并根据它们的排序值对这些对象进行排序。你的代码会更干净,你会保持理智。

标签: java arrays string sorting


【解决方案1】:

这部分有问题:

} else if (na > nb) {
    r = -1;
    n = nb;

应该是

} else if (na > nb) {
    r = 1;
    n = nb;

这将使--'!@# 出现在所有其他值之前,因为当变量newAnewB 完成替换时,它们将是空字符串。如果这不是预期的结果,您必须更改它。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多