Java 对字符串列表进行排序,以显示具有特定子字符串的第一个字符串,然后按排序顺序显示其余字符串

Java 对字符串列表进行排序,以显示具有特定子字符串的第一个字符串,然后按排序顺序显示其余字符串,java,comparator,Java,Comparator,我有一个字符串列表(com.abc.c345、com.abc.a123、com.abc.d456、com.abc.b234、com.qwr.a1、com.wer.b2、com.ert.c3) 我想对其进行排序,以便包含“com.abc”的字符串将首先以排序样式显示,然后以排序样式显示其余字符串 所以输出应该是这样的 (com.abc.a123、com.abc.b234、com.abc.c345、com.abc.d456、com.ert.c3、com.qwr.a1、com.wer.b2) 编辑1:

我有一个字符串列表(com.abc.c345、com.abc.a123、com.abc.d456、com.abc.b234、com.qwr.a1、com.wer.b2、com.ert.c3)

我想对其进行排序,以便包含“com.abc”的字符串将首先以排序样式显示,然后以排序样式显示其余字符串

所以输出应该是这样的

(com.abc.a123、com.abc.b234、com.abc.c345、com.abc.d456、com.ert.c3、com.qwr.a1、com.wer.b2)

编辑1: 我尝试将比较器用作:

    Collections.sort(list, new Comparator<LoggerDetails>() {
        @Override
        public int compare(LoggerDetails o1, LoggerDetails o2) {
            if (o1.logger.startsWith("com.abc") && o2.logger.startsWith("com.abc")) {
                return o1.logger.compareTo(o2.logger);
            }
            if (o1.logger.startsWith("com.abc") && !o2.logger.startsWith("com.abc")) {
                return -1;
            }
            if (o1.logger.startsWith("com.abc") && !o2.logger.startsWith("com.abc")) {
                return 1;
            }
            return 0;
        }
    });
Collections.sort(列表,新比较器(){
@凌驾
公共整数比较(LoggerDetails o1,LoggerDetails o2){
if(o1.logger.startsWith(“com.abc”)和&o2.logger.startsWith(“com.abc”)){
返回o1.logger.compareTo(o2.logger);
}
if(o1.logger.startsWith(“com.abc”)和&!o2.logger.startsWith(“com.abc”)){
返回-1;
}
if(o1.logger.startsWith(“com.abc”)和&!o2.logger.startsWith(“com.abc”)){
返回1;
}
返回0;
}
});

通过删除从子字符串开始的每个条目并将其添加到新列表中来创建一个新列表


之后,您可以使用list.addAll(0,newList)添加新列表的元素。

您只需使用java中util包中提供的Collections.sort对列表进行排序。您想要的输出似乎是按字母顺序和数字顺序排列的格式,这样就可以了。下面是对我有用的代码示例:

    List<String> list = new ArrayList<>();
    list.add("com.abc.c345");
    list.add("com.abc.a123");
    list.add("com.abc.d456");
    list.add("com.abc.b234");
    list.add("com.qwr.a1");
    list.add("com.wer.b2");
    list.add("com.ert.c3");

    Collections.sort(list);
    list.forEach(value -> System.out.println(value));
List List=new ArrayList();
list.add(“com.abc.c345”);
list.add(“com.abc.a123”);
list.add(“com.abc.d456”);
list.add(“com.abc.b234”);
添加(“com.qwr.a1”);
添加(“com.wer.b2”);
添加(“com.ert.c3”);
集合。排序(列表);
list.forEach(value->System.out.println(value));

希望有帮助

非常接近:使用比较器,它根据第一个标准执行排序,然后将其与自然排序比较器组合:

Collections.sort(list, new Comparator<LoggerDetails>() {
    @Override
    public int compare(LoggerDetails o1, LoggerDetails o2) {
        if(o1.logger.startsWith("com.abc") && !o1.logger.startsWith("com.abc")) {
            return -1;
        }
        if (o1.logger.startsWith("com.abc") && !o1.logger.startsWith("com.abc")) {
            return -1;
        } -- I just copypasted your original code, this should definitely be vice versa
        return 0;
    }  
}.thenComparing(o -> o.logger, Comparator.naturalOrder()));

或者,如果你有更多这样的“特殊”字符串(我注意到你一直在编辑原始帖子),请将它们映射到数字上。

com
对所有人来说都很常见?'com.abc'是我必须排序的常用子字符串。剩下的条目可以从任何内容开始。到目前为止,您尝试过哪些选项?我尝试过使用比较器,但没有work@Sanket:比较器是什么样子的?“不起作用”的确切含义是什么?'com.abc'是一个虚拟值,所以它不起作用。实际值是另外一回事。为了更清楚,你能提供一组输入样本吗。。我可以在你的问题中看到com.qwr和com.ert,那么你说dummy是什么意思呢?我尝试了这个方法,但是我的端点给了我这个错误:java.lang.IllegalArgumentException:比较方法违反了它的一般约定!如果两次使用相同的结果,您缺少
return 1
案例,我认为您不希望得到相同的结果。这意味着排序算法会根据比较器提供的数据混淆小于、等于和大于的内容。修复您的if-return代码或使用函数进行比较。它起作用了,我的代码中还有一些其他问题。谢谢:)
comparing(o -> o.logger.startsWith("com.abc"), Comparator.reverseOrder())