为了账号安全,请及时绑定邮箱和手机立即绑定

Java 按所需字符串排序

Java 按所需字符串排序

白衣非少年 2023-08-09 15:45:11
我对比较器的想法很陌生,我正在研究对字符串进行排序的方法。在下面的代码中,我创建了一个列表并使用该Collections.sort()方法对其进行排序。这是代码:public class ComparatorTest {    /**     * @param args the command line arguments     */    public static void main(String[] args) {        // TODO code application logic here        List<String> list = new ArrayList<String>();        list.addAll(Arrays.asList("Bob Stone", "Jordan Brand", "Bob Mass", "Dylan Walsh","Tom Mavis","Bob Ganley"));        System.out.println("Before sort "+ list);        Collections.sort(list);        System.out.println("After sort "+ list);    }}如何修改它以使用给定的字符串进行排序,而不是仅按字母顺序排序?例如,如果我给出字符串BOB,那么所有 BOB 将移动到列表的前面。我之前确实问过一个排序问题,但我误解了排序的想法,它更像是一个过滤问题(java按照用户输入的字符串值对字符串列表进行排序)。这个问题与我之前的问题不同,因为现在我试图对字符串进行实际排序和重新排列,而不是过滤它们。
查看完整描述

3 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

您可以使用该Boolean.compare方法检查字符串是否以“Bob”开头:

Comparator<String> bobsFirst = (a, b) -> Boolean.compare(b.startsWith("Bob"), a.startsWith("Bob"));

以这种方式比较它们(先 b,然后 a),首先以“Bob”开头。

然后,使用自然顺序进行平局:

Comparator<String> comparator = bobsFirst.thenComparing(a -> a);

请注意,startsWith区分大小写。要忽略“Bob”的大小写,您可以将b.startsWith("Bob")(与 类似a)替换为:

 b.regionMatches(true, 0, "Bob", 0, 3)


查看完整回答
反对 回复 2023-08-09
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

Collator班级

用于比较和排序自然语言(人类语言)的规则正式称为排序规则

在Java中,任何排序规则都是在类实现Collator类中定义的。通常,它的子类RulesBasedCollator用于比较/排序。该类CollatorProvider是一个SPI(服务提供者接口),用于提供注册的Collator实现。最近版本的 Java 默认使用Unicode Consortium在其公共区域设置数据存储库 (CLDR)中提供的排序规则定义。

Collator据推测,您可以根据自己的需要自由地构建自己的实现,并使用此类特殊规则。

请注意,校对是一个非常复杂的领域,其规则因人类语言和文化规范而异。如果您只关心美式英语,那么您可能不会遇到什么问题。但如果您处理其他语言、文化或替代字符(例如©或 表情符号),那么,这里就是龙


查看完整回答
反对 回复 2023-08-09
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

您需要做的第一件事是了解规则,例如,当出现以下情况时会发生什么:

  • 左边和右边都以“Bob”开头?

  • 当左侧和右侧都不以“Bob”开头时会发生什么?

  • 您关心匹配案例吗?

  • 您只关心名字还是应该包含姓氏或者您希望它是可配置的?

一个简单的实现可能看起来像......

public class NameComparator implements Comparator<String> {


    private String name;


    public NameComparator(String name) {

        this.name = name;

    }


    @Override

    public int compare(String lhs, String rhs) {

        if (lhs.startsWith(name) && rhs.startsWith(name)) {

            return lhs.compareTo(rhs);

        } else if (lhs.startsWith(name)) {

            return -1;

        } else if (lhs.startsWith(name)) {

            return 1;

        }


        return lhs.compareTo(rhs);

    }

}

现在,这会进行大小写匹配(因此bob与 不同Bob),并将对自己组内的所有“Bobs”进行子排序


正如您所看到的,五秒钟的思考已经提出了许多可能的方法来对列表进行排序,因此您需要了解您的选项,您可能希望自定义哪些选项以及您想要修复哪些选项。


您可以使用类似...的方式调用此示例


Collections.sort(list, new NameComparator("Bob"));

这将根据您可用的输入、输出...


Before sort [Bob Stone, Jordan Brand, Bob Mass, Dylan Walsh, Tom Mavis, Bob Ganley]

After sort [Bob Ganley, Bob Mass, Bob Stone, Dylan Walsh, Jordan Brand, Tom Mavis]


查看完整回答
反对 回复 2023-08-09
  • 3 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信