【问题标题】:In Java, how do you sort a series of strings based off substring in ascending order? [closed]在Java中,如何根据子字符串按升序对一系列字符串进行排序? [关闭]
【发布时间】:2021-05-17 05:45:22
【问题描述】:

我有一个包含一系列字符串的数据输入文件。例如:

0001zz99ab9ssss
0002zz4p921ssss
0003zz123i5ssss
0004zzA9382ssss
0005zz4p921ssss

我想根据子字符串 (6,11) 升序对这些字符串进行排序。所以输出应该是:

0003zz123i5ssss
0002zz4p921ssss
0005zz4p921ssss
0001zz99ab9ssss
0004zzA9382ssss

如果有帮助,我也在使用 ArrayLists。

【问题讨论】:

  • 这能回答你的问题吗? sorting strings in Java based on substrings
  • 问题因“需要更多关注”而关闭,但三个人能够理解并提供答案?这是来自 SO 的通常的“以任何必要的方式关闭它”。
  • 对于 SO 社区的这种“欢迎”行为,我深表歉意。不幸的是,我们中的一些人一有机会就倾向于行使结束问题的权利。一种斯坦福实验恕我直言。这个问题是绝对正常的,并且符合所有 SO 标准。
  • @andbi 我不这么认为。我看不出在提问之前应该做的问题。对我来说,这看起来像为我工作问题

标签: java string sorting arraylist substring


【解决方案1】:

我建议在流中使用比较器。

List<String> values = List.of("0001zz99ab9ssss","0002zz4p921ssss", "0003zz123i5ssss", "0004zzA9382ssss", "0005zz4p921ssss");
List<String> result =  values.stream()
                                  .sorted(Comparator.comparing(o -> o.substring(6, 11)))
                                  .collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    实现一个比较器并在排序中使用它。

    class SubstringComparator implements Comparator<String> {
         public int compare(String s1, String s2) {
             return s1.substring(6,11).compareTo(s2.substring(6,11));
         }
    }
    

    并在排序中使用它。

    Collections.sort(myList, new SubstringComparator());
    

    【讨论】:

      【解决方案3】:

      虽然其他答案是正确的,但它们并没有优化内存使用:对于每次比较,您都会创建 两个 新字符串,而有一种方法在比较器中根本不会发生堆分配:

      Comparator<String> comparator = (a, b) -> {
          for (int i = 6; i < 11; i++) {
              int cmp = Character.compare(a.charAt(i), b.charAt(i));
              if (cmp != 0) {
                  return cmp;
              }
          }
                      
          return 0;
      };
      

      附:此代码不考虑字符串短于 10 个字符(与其他字符相同)的情况 - 如果它们可能出现在您的输入中,请不要忘记考虑它们

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 2015-08-13
        • 1970-01-01
        • 2013-10-28
        • 1970-01-01
        • 2012-10-14
        • 2012-04-03
        相关资源
        最近更新 更多