返回已排序的List <object>,其中第一个项值始终为空

时间:2017-05-10 13:11:10

标签: java linked-list

使用Object列表,其中一个项目为空String。尝试编写将返回排序列表的方法。通过排序意味着列表的第一个项值应始终为空String

由于我不想操纵未排序的列表,我正在创建一个新列表进行排序。

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

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

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

    //What to do here

    return sortedList;
}

看了很多SO帖子,但很困惑。

3 个答案:

答案 0 :(得分:2)

您可以信任String.compareTo以匹配您寻求的订单。这是比较者:

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

或直接在特定课程中实施Comparable(此处为Dummy)

class Dummy implements Comparable<Dummy>{

    String name;

    public int compareTo(Dummy o) {
        return this.name.compareTo(o.name);
    }
}

原因:

String.compareTo检查两者的前几个字符以找到差异(直到两者的最小长度),如果它们匹配,则长度用于产生差异,最长的将在最短之后(shortest.compareTo(longuest)。 {1}}将返回负值(长度差异))。

在这种情况下,"".compareTo("abc"),空字符串中没有字符,因此跳过第一个检查,并使用长度来比较String s,因此空String将永远被视为首先与任何“非空”String

进行比较

上一个Dummy类的示例(只需要添加构造函数Dummy(String)

public class Main {

    public static void main(String[] args) {
       List<Dummy> dummies = new LinkedList<Dummy>();
       dummies.add(new Dummy("abc.com.core"));
       dummies.add(new Dummy(""));
       dummies.add(new Dummy("abc.com.core.def"));

       System.out.println("BEFORE : " + dummies);
       Collections.sort(dummies);
       System.out.println("AFTER : " + dummies);
    }
}

输出:

BEFORE : [abc.com.core, , abc.com.core.def]
AFTER : [, abc.com.core, abc.com.core.def]

答案 1 :(得分:1)

您可以将此条件放在比较器中,以便考虑具有空值的元素&#34; less&#34;比其他元素,以便它显示在排序列表的开头。尝试这样的事情:

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()));
  }
});

我没有对此进行测试,但这应该能够明确这个想法。如果空元素显示在列表末尾,请交换-11

如果您的List很大并且排序需要花费很多时间,那么在排序之前删除空元素,然后排序,然后将元素放在开头可能是个更好的主意。

答案 2 :(得分:1)

Comparator解决方案对我来说似乎是可行的;您缺少的是实施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()));
        }
    }
});

根据Java docsComparator有一个compare方法返回一个int

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

所以你需要的Comparator应该返回两个字符串的比较,如果它们与""不同,并且如果第一个(或第二个)字符串则为-1(或1)是空的。