Java 返回已排序的列表<;对象>;其中第一项值始终为空

Java 返回已排序的列表<;对象>;其中第一项值始终为空,java,linked-list,Java,Linked List,使用对象列表,其中一个项具有空字符串。尝试编写将返回排序列表的方法。排序意味着列表的第一项值应始终为空字符串 因为我不想操纵未排序的列表,所以我正在创建一个新的列表进行排序 到目前为止,我的代码是: private List<LoggerConfig> sort(List<LoggerConfig> unSortedList) { List<LoggerConfig> sortedList = new ArrayList<LoggerCo

使用
对象列表
,其中一个项具有空
字符串
。尝试编写将返回排序列表的方法。排序意味着列表的第一项值应始终为空
字符串

因为我不想操纵未排序的列表,所以我正在创建一个新的列表进行排序

到目前为止,我的代码是:

   private List<LoggerConfig> sort(List<LoggerConfig> unSortedList) {

    List<LoggerConfig> sortedList = new ArrayList<LoggerConfig>(unSortedList);

    //What to do here

    return sortedList;
}
私有列表排序(列表未排序列表){
List sortedList=新数组列表(未排序列表);
//在这里做什么
返回分类列表;
}

看了很多
的帖子,但是很困惑

您可以将此条件放在比较器中,以便将具有空值的元素视为比其他元素“少”,以便它显示在排序列表的开头。试着这样做:

Collections.sort(sortedList, new Comparator<LoggerConfig>() {
  @Override
  public int compare(LoggerConfig o1, LoggerConfig o2) {
    if(o1.getName().isEmpty(){
      return -1;
    }
    if(o2.getName().isEmpty(){
      return 1;
    }
    return (o1.getName().compareTo(o2.getName()));
  }
});
Collections.sort(sortedList,new Comparator(){
@凌驾
公共int比较(LoggerConfig o1,LoggerConfig o2){
if(o1.getName().isEmpty()的值){
返回-1;
}
if(o2.getName().isEmpty()){
返回1;
}
返回(o1.getName().compareTo(o2.getName());
}
});
我没有对此进行测试,但这应该让想法更清楚。如果列表末尾显示空元素,请将
-1
1
互换


如果您的列表很大,并且排序需要很多时间,那么最好在排序之前删除空元素,然后进行排序,然后将元素放在开头。

您可以将此条件放在比较器中,以便将具有空值的元素视为“较少”而不是其他元素,因此它会显示在排序列表的开头。请尝试以下操作:

Collections.sort(sortedList, new Comparator<LoggerConfig>() {
  @Override
  public int compare(LoggerConfig o1, LoggerConfig o2) {
    if(o1.getName().isEmpty(){
      return -1;
    }
    if(o2.getName().isEmpty(){
      return 1;
    }
    return (o1.getName().compareTo(o2.getName()));
  }
});
Collections.sort(sortedList,new Comparator(){
@凌驾
公共int比较(LoggerConfig o1,LoggerConfig o2){
if(o1.getName().isEmpty()的值){
返回-1;
}
if(o2.getName().isEmpty()){
返回1;
}
返回(o1.getName().compareTo(o2.getName());
}
});
我没有对此进行测试,但这应该让想法更清楚。如果列表末尾显示空元素,请将
-1
1
互换


如果您的列表很大,并且排序需要很多时间,那么最好在排序之前删除空元素,然后进行排序,然后将元素放在开头。

比较器解决方案对我来说似乎是可行的;您缺少的是实现
compare
方法,这样它就可以满足您的需要

Collections.sort(sortedList, new Comparator<LoggerConfig>() {
    @Override
    public int compare(LoggerConfig o1, LoggerConfig o2) {
        if(o1.getName().equals("")){
            return -1;
        } else if(o2.getName().equals("")) {
            return 1;
        } else {
            return (o1.getName().compareTo(o2.getName()));
        }
    }
});
Collections.sort(sortedList,new Comparator(){
@凌驾
公共int比较(LoggerConfig o1,LoggerConfig o2){
if(o1.getName().equals(“”){
返回-1;
}else if(o2.getName().equals(“”){
返回1;
}否则{
返回(o1.getName().compareTo(o2.getName());
}
}
});
根据,比较器
有一个
compare
方法,该方法返回一个

  • 如果第一个参数小于第二个参数,则小于0
  • 如果参数相等,则为0
  • 如果第一个参数大于第二个参数,则大于0

因此,如果两个字符串都不同于
,则所需的
比较器应返回两个字符串的比较,如果第一个字符串(或第二个字符串)不同,则返回-1(或1)字符串为空。

比较器的解决方案对我来说似乎是可行的;您缺少的是实现
compare
方法,以便它可以执行您想要的操作

Collections.sort(sortedList, new Comparator<LoggerConfig>() {
    @Override
    public int compare(LoggerConfig o1, LoggerConfig o2) {
        if(o1.getName().equals("")){
            return -1;
        } else if(o2.getName().equals("")) {
            return 1;
        } else {
            return (o1.getName().compareTo(o2.getName()));
        }
    }
});
Collections.sort(sortedList,new Comparator(){
@凌驾
公共int比较(LoggerConfig o1,LoggerConfig o2){
if(o1.getName().equals(“”){
返回-1;
}else if(o2.getName().equals(“”){
返回1;
}否则{
返回(o1.getName().compareTo(o2.getName());
}
}
});
根据,比较器
有一个
compare
方法,该方法返回一个

  • 如果第一个参数小于第二个参数,则小于0
  • 如果参数相等,则为0
  • 如果第一个参数大于第二个参数,则大于0

因此,如果两个字符串都不同于
,则所需的
比较器应返回两个字符串的比较,如果第一个(或第二个)字符串为空,则返回-1(或1)。

您可以信任
字符串。compareTo
以匹配您所寻求的顺序。这是一个比较器:

new Comparator<LoggerConfig>() {
  @Override
  public int compare(LoggerConfig o1, LoggerConfig o2) {
    return (o1.getName().compareTo(o2.getName()));
  }
};
原因:

字符串.compareTo
检查两者的前几个字符以找出差异(直到两者的最小长度),如果它们匹配,则使用长度来产生差异,最长的将在最短的后面(
shortest.compareTo(longuest)
将返回负值(长度差异))

在这种情况下,
”。与(“abc”)
相比,空字符串中没有字符,因此跳过第一次检查,并使用长度来比较
字符串
s,因此空
字符串
将始终被视为与任何“非空”
字符串
s的第一次比较

前面的
Dummy
类的示例(只需添加构造函数
Dummy(String)


您可以信任
字符串。compareTo
来匹配您寻求的顺序。下面是一个比较器:

new Comparator<LoggerConfig>() {
  @Override
  public int compare(LoggerConfig o1, LoggerConfig o2) {
    return (o1.getName().compareTo(o2.getName()));
  }
};
原因:

字符串.compareTo
检查两者的前几个字符以找出差异(直到两者的最小长度),如果它们匹配,则使用长度来产生差异,最长的将在最短的后面(
shortest.compareTo(longuest)
将返回负值(长度差异))

在本例中,
”。与(“abc”)
相比,空字符串中没有字符,因此跳过第一次检查,并使用长度来比较
字符串
s,因此始终会看到空
字符串