Java 将null置于列表末尾

Java 将null置于列表末尾,java,list,collections,null,Java,List,Collections,Null,我需要在列表的末尾放置空对象。以下是我为此所做的示例: public static void main(String... args) { List<String> strings = Arrays.asList(new String[]{"A", null, "B"}); for(String string : strings) { System.out.println(string); } System.out.println(

我需要在
列表的末尾放置空对象。以下是我为此所做的示例:

public static void main(String... args) {
    List<String> strings = Arrays.asList(new String[]{"A", null, "B"});

    for(String string : strings) {
        System.out.println(string);
    }

    System.out.println("==================");

    List<String> result = new ArrayList<String>();
    List<String> nullStrings = new ArrayList<String>();

    for(String string : strings) {
        if(string != null) {
            result.add(string);         
        } else {
            nullStrings.add(string);
        }
    }

    result.addAll(nullStrings);

    for(String string : result) {
        System.out.println(string);
    }
}
publicstaticvoidmain(字符串…参数){
List strings=Arrays.asList(新字符串[]{“A”,null,“B”});
for(字符串:字符串){
System.out.println(字符串);
}
System.out.println(“===============================”);
列表结果=新建ArrayList();
List nullStrings=new ArrayList();
for(字符串:字符串){
if(字符串!=null){
结果。添加(字符串);
}否则{
nullStrings.add(字符串);
}
}
result.addAll(空字符串);
for(字符串:结果){
System.out.println(字符串);
}
}
我期待着一种更高效、更智能的方法来实现这一点。是否可以在实际列表中进行交换,以便将null节点放在末尾,这样我就不需要另外两个列表(null字符串、result)和额外的迭代

更新 分类对我的案子不起作用。我制作的这个示例代码只是为了测试。实际上我有一个不同类型的对象。此外,排序将打破该位置

假设我有这个
null,Obj2,Obj1
,如果做任何类似排序的事情,它可能会发生
Obj1,Obj2,null
。但是我需要
Obj2、Obj1、null
您可以使用和自定义

下面是比较代码:

@Override 
public int compare(String left, String right) {
 if (left == right) {
   return 0;
 }
 if (left == null) {
   return 1;
 }
 if (right == null) {
   return -1;
 }
 return 0;
 }
请注意,根据此
比较器的值相等的元素不会重新排序。发件人:

这种排序保证是稳定的:相等的元素不会因排序而重新排序


总体战略在我看来很好。我将带来以下变化:

  • 使用适当的大小初始化结果列表
  • 不要为空值使用单独的列表。在迭代结束时,只需将初始列表的长度与结果列表的长度进行比较,就可以知道需要添加多少空值
尽管制作列表副本将使用更多内存,但它可能比更改初始列表更快,因为每次删除元素都需要移动所有后续元素。排序是N*log(N),而复制元素是O(N)

[编辑owlstead]

public static List<String> moveNullsToEnd(final List<String> strings) {

    final List<String> newStrings = new ArrayList<String>(strings.size());

    for (String string : strings) {
        if (string != null) {
            newStrings.add(string);
        }
    }

    for (int i = 0, remaining = strings.size() - newStrings.size(); i < remaining; i++) {
        newStrings.add(null);
    }

    return newStrings;
}
公共静态列表moveNullsToEnd(最终列表字符串){
final List newStrings=newarraylist(strings.size());
for(字符串:字符串){
if(字符串!=null){
添加(字符串);
}
}
对于(int i=0,剩余=strings.size()-newStrings.size();i
只需将非null元素移到前面,并用null填充列表的其余部分

int j = 0;
for (int i = 0; i < strings.size(); i++)
    if (strings.get(i) != null){
        strings.set(j, strings.get(i));
        j++;
    }
for (; j < strings.size(); j++)
    strings.set(j, null);
下面是您可以使用的代码

删除所有空元素

int noOfNull =0 ,i=0;

for(; i< strings.size() ; i++)
{
    if(strings.get(i) == null)
    {
        noOfNull++;
    }
}
strings.removeAll(Collections.singleton(null));
for(i =strings.size(); i < strings.size()+noOfNull ; i++)
        {
            strings.add(null);
        }
int noOfNull=0,i=0;
对于(;i
在not null元素之后用null填充数组

int noOfNull =0 ,i=0;

for(; i< strings.size() ; i++)
{
    if(strings.get(i) == null)
    {
        noOfNull++;
    }
}
strings.removeAll(Collections.singleton(null));
for(i =strings.size(); i < strings.size()+noOfNull ; i++)
        {
            strings.add(null);
        }
for(i=strings.size();i
List List=new ArrayList();
列表。添加(“BR64”);
列表。添加(“SWG620”);
列表。添加(“”);
列表。添加(“sw0”);
列表。添加(“R124”);
列表。添加(“R219”);
列表。添加(“TaGh20”);
列表。添加(“SW6505”);
列表。添加(“”);
list.add(空);
列表。添加(“SW6505”);
列表。添加(“社署157”);
添加(“本地主机”);
列表。添加(“qaGh20_241”);
列表。添加(“gen”);
list.add(空);
列表。添加(“taGh20”);
列表。添加(“禅”);
列表。添加(“QWG”);
列表。添加(“SWG62”);
列表。添加(“SWG620”);
Collections.sort(list,newcomparator(){
@凌驾
公共整数比较(字符串o1、字符串o2){
如果(o1!=null&&o2!=null&&o1.length()>0&&o2.length()>0){
返回(Character.toLowerCase(o1.charAt(0))==Character.toLowerCase(o2.charAt(0)))
?o1.与(o2)相比
:(Character.toLowerCase(o1.charAt(0))+o1.substring(1))
.compareTo((Character.toLowerCase(o2.charAt(0))+o2.substring(1));
}否则{
返回值(o1==o2)?0:((o1==null | | o1==“”)1:-1);
}
}
});
系统输出打印项次(列表);

输出-:[BR64,gen,localhost,QWG,qaGh20,qaGh20,241,R124,R219,SW6505,SWG620,SWG620,SWG62,SWU,SWU 6505,sw0,swd_157,TaGh20,TaGh20,zen,null,null,null]

对于
“A”,null,“B”
,结果必须是
“A”,“B”,null
,而不是
“B”,“A”,null
@johnchen902它必须是
“A”,“B”,null
。如果所有非null元素比较为相等,则排序不会中断顺序。看:你最初的问题是什么?也许这有助于显示实际对象并解释为什么位置不需要更改“我需要将空对象放在
列表的末尾。
”您建议如何保持非空元素的顺序?我不能。我提供的这段代码是为了测试而编写的。在实际情况中,我有一个不同的对象,排序将中断引用。@Heuster如果所有非空比较为相等,则它们的顺序为preserved@kiheru不完全正确,
Comparator
明确定义了
0
只应为相等的元素返回。如果结果是正确的,那么这是“幸运的”,在将来的版本中可能是不正确的。@owlstead这当然是正确的,但是如果在
数组列表上使用
链接列表
,调用
get(i)
可能会很昂贵。使用原始
列表
的其他要点。@owlstead如果您使用的是
链接列表
,则需要
列表迭代器
+1以获得线性时间解决方案-包含5行代码,比公认的答案更简单、更有效。虽然此代码片段可能是解决方案,包括解释真的有助于提高你的文章质量。记住你是一个