Java 对数组应用自定义排序顺序的最有效方法

Java 对数组应用自定义排序顺序的最有效方法,java,arrays,sorting,Java,Arrays,Sorting,我有一个字符串数组,类似于: [module-src1, module-src2, module-src3, ..., source1, source2, source3, ...] 我想将此数组重新排序为: [source1, source2, source3, ..., module-src1, module-src2, module-src3, ...] 在Java中,最有效的方法是什么 我曾考虑过每个队列存储两个队列,但这似乎过于复杂,我希望看看是否有更有效的方法来实现这一点。我能

我有一个字符串数组,类似于:

[module-src1, module-src2, module-src3, ..., source1, source2, source3, ...] 
我想将此数组重新排序为:

[source1, source2, source3, ..., module-src1, module-src2, module-src3, ...]
在Java中,最有效的方法是什么


我曾考虑过每个队列存储两个队列,但这似乎过于复杂,我希望看看是否有更有效的方法来实现这一点。

我能想到的最好的方法是让你自己的类像

public class Source implements Comparable<Source> {
    private String name;
    public Source(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    @Override
    public String toString(){
        return name;
    }

    @Override
    public int compareTo(Source another) {
        //do whatever sorting you want here
        //for example:
        if(name.subString(0,5).equalsIgnoreCase("module") &&
                another.getName().subString(0,5).equalsIgnoreCase("module"){
            //both start with module, so alphabetize
            return name.compareTo(another.getName());
        } else if(name.subString(0,5).equalsIgnoreCase("module") &&
                !another.getName().subString(0,5).equalsIgnoreCase("module"){
            //only this one starts with "module", the other one comes first
             return -1;
        }
        ...
    }
}
公共类源代码实现了可比较的{
私有字符串名称;
公共源(字符串名称){
this.name=名称;
}
公共字符串getName(){
返回名称;
}
@凌驾
公共字符串toString(){
返回名称;
}
@凌驾
public int compareTo(另一个源){
//你想在这里做什么都行
//例如:
if(name.subString(0,5).equalsIgnoreCase(“模块”)&&
另一个.getName().subString(0,5).equalsIgnoreCase(“模块”){
//两者都以模块开头,所以按字母顺序排列
返回name.compareTo(另一个.getName());
}else if(name.subString(0,5).equalsIgnoreCase(“模块”)&&
!另一个.getName().subString(0,5).equalsIgnoreCase(“模块”){
//只有这一个以“模块”开头,另一个先到
返回-1;
}
...
}
}
希望你能从中得到要点


一旦您在
数组列表中有了所有这些对象,只需执行
Collections.sort(myArray)
,它应该按照您想要的顺序对其进行排序您必须对您的输入做出一些假设(即,您必须假设数组中的所有字符串的格式都是“module-”或“source”-前缀).如果是这样的话,你可以这样做:

public static void main(String[] args){
    String[] strings = new String[]{"module-src1","module-src2",
            "module-src3","source1","source2","source3"};
    Arrays.sort(strings,new ModSrcComparator());
    for(String s : strings) System.out.print(s+" ");
    System.out.println();
}

private static class ModSrcComparator implements Comparator<String>{
    @Override
    public int compare(String s1, String s2) {
        if(!s1.contains("-") && s2.contains("-")) return -1;
        else if(s1.contains("-") && !s2.contains("-")) return 1;
        return s1.compareTo(s2);
    }
}
publicstaticvoidmain(字符串[]args){
字符串[]字符串=新字符串[]{“module-src1”、“module-src2”,
“模块-src3”、“源1”、“源2”、“源3”};
sort(字符串,新的modsrcparator());
对于(字符串s:strings)System.out.print(s+“”);
System.out.println();
}
私有静态类ModSrcComparator实现Comparator{
@凌驾
公共整数比较(字符串s1、字符串s2){
如果(!s1.contains(“-”)&&s2.contains(“-”)返回-1;
else if(s1.contains(“-”&!s2.contains(“-”)返回1;
返回s1.compareTo(s2);
}
}

如果要保留代码行数最少的字符串数组:

List<String> myList = new ArrayList<>(Arrays.asList(myArray))
Collections.sort(myList);
myArray = myList.toArray(new String[0]);

你是如何定义效率的?数量级,还是你的时间?一些涉及数组的东西comparators@La-comadreja可能是最少的行数了?我忘了
比较器
(-)ლ)排序不是按字母顺序吗?我的初始数组已经按字母顺序排列了,我需要将源代码移到模块前面,同时保持源代码的字母顺序和模块的字母顺序。我的错。你必须先做Epicblood的答案,然后自定义排序顺序,或者你可以使用比较器代替实施可比的广告。。。
Collections.sort(myList);