Java 按所需字符串排序

我对比较器的想法很陌生,我正在研究对字符串进行排序的方法。在下面的代码中,我创建了一个列表并使用该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按照用户输入的字符串值对字符串列表进行排序)。这个问题与我之前的问题不同,因为现在我试图对字符串进行实际排序和重新排列,而不是过滤它们。


白衣非少年
浏览 131回答 3
3回答

饮歌长啸

您可以使用该Boolean.compare方法检查字符串是否以“Bob”开头:Comparator<String>&nbsp;bobsFirst&nbsp;=&nbsp;(a,&nbsp;b)&nbsp;->&nbsp;Boolean.compare(b.startsWith("Bob"),&nbsp;a.startsWith("Bob"));以这种方式比较它们(先 b,然后 a),首先以“Bob”开头。然后,使用自然顺序进行平局:Comparator<String>&nbsp;comparator&nbsp;=&nbsp;bobsFirst.thenComparing(a&nbsp;->&nbsp;a);请注意,startsWith区分大小写。要忽略“Bob”的大小写,您可以将b.startsWith("Bob")(与 类似a)替换为:&nbsp;b.regionMatches(true,&nbsp;0,&nbsp;"Bob",&nbsp;0,&nbsp;3)

回首忆惘然

Collator班级用于比较和排序自然语言(人类语言)的规则正式称为排序规则。在Java中,任何排序规则都是在类实现Collator类中定义的。通常,它的子类RulesBasedCollator用于比较/排序。该类CollatorProvider是一个SPI(服务提供者接口),用于提供注册的Collator实现。最近版本的 Java 默认使用Unicode Consortium在其公共区域设置数据存储库 (CLDR)中提供的排序规则定义。Collator据推测,您可以根据自己的需要自由地构建自己的实现,并使用此类特殊规则。请注意,校对是一个非常复杂的领域,其规则因人类语言和文化规范而异。如果您只关心美式英语,那么您可能不会遇到什么问题。但如果您处理其他语言、文化或替代字符(例如©或 表情符号),那么,这里就是龙。

犯罪嫌疑人X

您需要做的第一件事是了解规则,例如,当出现以下情况时会发生什么:左边和右边都以“Bob”开头?当左侧和右侧都不以“Bob”开头时会发生什么?您关心匹配案例吗?您只关心名字还是应该包含姓氏或者您希望它是可配置的?一个简单的实现可能看起来像......public class NameComparator implements Comparator<String> {&nbsp; &nbsp; private String name;&nbsp; &nbsp; public NameComparator(String name) {&nbsp; &nbsp; &nbsp; &nbsp; this.name = name;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public int compare(String lhs, String rhs) {&nbsp; &nbsp; &nbsp; &nbsp; if (lhs.startsWith(name) && rhs.startsWith(name)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return lhs.compareTo(rhs);&nbsp; &nbsp; &nbsp; &nbsp; } else if (lhs.startsWith(name)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return -1;&nbsp; &nbsp; &nbsp; &nbsp; } else if (lhs.startsWith(name)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return 1;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return lhs.compareTo(rhs);&nbsp; &nbsp; }}现在,这会进行大小写匹配(因此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]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java