首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Java:根据匹配的字符串/模式对数组进行排序

Java:根据匹配的字符串/模式对数组进行排序
EN

Stack Overflow用户
提问于 2013-06-25 05:56:18
回答 7查看 6K关注 0票数 7

我需要排序一个数组,其中匹配的项目出现,而其他将下降。

为了快递。我有一个数组: z、asxdf、abasdf、abcasdf、b、bc、bcd、c ,我需要的是当我传递一个KeyWord假设"b"时,它应该对给定的数组进行排序,其中以b.开头的所有字符串都将放在第一位,其余的则放在第一位。它将产生最终输出: b,bc,bcd,z,c,.(rest).

如果可以在Java中使用比较器呢?

代码语言:javascript
代码运行次数:0
运行
复制
String keyWord = "b";
String[] s = {"z", "asxdf", "abasdf", "abcasdf", "b", "bc", "bcd", "c"};
Arrays.sort(s, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {

            //Code to sort array according to need

    }
});
System.out.println(Arrays.toString(s));

Result -> [ b , bc , bcd , z , c , ...]

(我可以使用List而不是Array,或者其他任何帮助我解决这个问题的方法)

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-06-25 06:19:42

在回答是否可以使用比较器进行比较时,答案是肯定的:您只需要创建一个新的比较器类,而不是创建一个匿名比较器,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
    class MyComparator implements Comparator<String> {

        private final String keyWord;

        MyComparator(String keyWord) {
            this.keyWord = keyWord;
        }

        @Override
        public int compare(String o1, String o2) {

            if(o1.startsWith(keyWord)) {
                return o2.startsWith(keyWord)? o1.compareTo(o2): -1;
            } else {
                return o2.startsWith(keyWord)? 1: o1.compareTo(o2); 
            }
        }
    }

然后在代码中使用比较器:

代码语言:javascript
代码运行次数:0
运行
复制
    String keyWord = "b";
    String[] s = {"z", "asxdf", "abasdf", "abcasdf", "b", "bc", "bcd", "c"};
    Arrays.sort(s, new MyComparator(keyWord));
    System.out.println(Arrays.toString(s));
票数 11
EN

Stack Overflow用户

发布于 2013-06-25 06:42:19

因为关键字匹配后的字符串长度似乎很重要,下面是我的版本:

代码语言:javascript
代码运行次数:0
运行
复制
Arrays.sort(s, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {

        boolean o1Has = o1.startsWith( keyWord );
        boolean o2Has = o2.startsWith( keyWord );

        if( o1Has && !o2Has  ) return -1;
        else if( o2Has && !o1Has ) return 1;
        else if( o1Has && o2Has ) return 0;
        else
            return o1.length() - o2.length();
    }
});

产量:

b,bc,bcd,z,c,asxdf,abasdf,abcasdf

票数 3
EN

Stack Overflow用户

发布于 2013-06-25 06:14:32

代码语言:javascript
代码运行次数:0
运行
复制
final String keyWord = "b";
String[] s = {"z", "asxdf", "abasdf", "abcasdf", "b", "bc", "bcd", "c"};
Arrays.sort(s, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {

            boolean o1_has_keyWord = o1.indexOf(keyWord.charAt(0)) == 0 && o1.contains(keyWord);
            boolean o2_has_keyWord = o2.indexOf(keyWord.charAt(0)) == 0 && o2.contains(keyWord);

        if (o1_has_keyWord && o2_has_keyWord)
        {
            if (o1.length() == o2.length())
            {
                if (o1.indexOf(keyWord.charAt(0)) > o2.indexOf(keyWord.charAt(0))){
                    return -1;
                }
                else if (o1.indexOf(keyWord.charAt(0)) == o2.indexOf(keyWord.charAt(0))){
                    return 0;
                }
                else
                {
                    return 1;
                }
            }
            else if (o1.length() > o2.length())
            {
                    return 1;
            }
            else 
            {
                return -1;
            }
        }
        else if (o1_has_keyWord && !o2_has_keyWord)
        {
            return -1;
        }
        else if (!o1_has_keyWord && o2_has_keyWord)
        {
            return 1;
        }


        return 0;

            //Code to sort array according to need

    }
});
System.out.println(Arrays.toString(s));

输出:

代码语言:javascript
代码运行次数:0
运行
复制
[b, bc, bcd, z, asxdf, abasdf, abcasdf, c]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17290105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档