【问题标题】:separating the string object into tokens?将字符串对象分成标记?
【发布时间】:2019-11-12 06:54:31
【问题描述】:

当一个String对象如下给出时,它应该将这些值分割成片段,用“,ve对它们进行排序,并通过对数字进行分组返回一个List。

String=123456 4568 567852 78212.





【问题讨论】:

  • 创建一个class。 Java 是一种面向对象的语言。 class 可以保存令牌的一些命名部分——不管它们是什么。现在您只需要一个了解您的classComparator。你甚至可以简单地implements Comparable<...>
  • 网上有很多关于如何实现比较器的教程。您发表评论说您在阅读鲍里斯的评论后 7 分钟就无法做到这一点。显然,您在解决问题方面付出的努力还不够。尝试通过实现基本的比较逻辑来修改您的代码以成功实现比较器,即使它不一定会给您想要的输出。然后尝试修改你的逻辑以获得你想要的输出。
  • 你没有做足够的研究。如果您遇到错误,请解决错误。我不是要烧烤你,但这显然是一个家庭作业问题。您需要学习自己解决此类问题,而不是在 SO 上提出问题以寻求易于研究的解决方案。我花了 3 分钟研究解决方案并实施了一个在正确轨道上的工作比较器。这里是:pastebin.com/FZK4FzKj 请注意,它不会为您提供所需的输出,但它是使用比较器的入门解决方案。
  • 添加为答案。我觉得好像我在这里放弃了太多,但公平地说,您可以在其他地方轻松找到此解决方案,而且我猜英语不是您的第一语言,这就是您无法研究的原因解决方案。

标签: java arrays collections


【解决方案1】:

使用比较器你可以试试这个:

public static void main(String[] args) {
    String input = "11B,11A,12,12/1,13,14,15,16,16A,17,17/1,57-51B,57,57-51A,1,10,11,53B,53A,53C,57-51C,57A";
    List<String> items = Arrays.asList(input.split("\\s*,\\s*"));


    Collections.sort(items, new Comparator<String>() {
        public int compare(String o1, String o2) {

            String o1StringPart = o1.replaceAll("\\d", "");
            String o2StringPart = o2.replaceAll("\\d", "");


            if(o1StringPart.equalsIgnoreCase(o2StringPart))
            {
                return extractInt(o1) - extractInt(o2);
            }
            return o1.compareTo(o2);
        }

        int extractInt(String s) {
            String num = s.replaceAll("\\D", "");
            // return 0 if no digits found
            return num.isEmpty() ? 0 : Integer.parseInt(num);
        }
    });

    for (String s : items) {
        System.out.println(s);
    }
}

就所需的输出而言,这不会完全符合您的要求,但它应该可以帮助您入门。

【讨论】:

  • 请注意,由于比较器可以调用log(n) 次,因此在比较器中工作通常是个坏主意。尽管答案确实说明了如何着手解决问题。
  • 感谢您的帮助。@BoristheSpider
  • @BoristheSpider 很乐观 ;) 比较器将被调用 至少 n - 1 次,这是不可避免的。最坏的情况是n 乘以log n...
  • @Holger 我的意思是每个项目 - 我认为这是正确的吗?例如,无法避免标记化 n 次的成本,但通过在比较器中进行,每个项目将执行多次。
  • @BoristheSpider 最坏的情况是O(n log n) 的规模(请注意,这不是实际调用次数的近似值),但由于比较器在每次调用时执行两次标记化,即使在n - 1 调用的最佳情况,它做了两倍必要的工作。尽管如此,我还是会继续做它,但消除标记化,而不是沉重的replaceAll(regex),可以通过一个简单的字符迭代来完成比较,只是稍微重一点,例如String.CASE_INSENSITIVE_ORDER
猜你喜欢
  • 2021-07-20
  • 2023-04-04
  • 2021-05-22
  • 2013-09-15
  • 1970-01-01
  • 2020-11-13
  • 2021-01-16
  • 2015-12-24
相关资源
最近更新 更多