Java 将null置于列表末尾

Java 将null置于列表末尾,java,arraylist,Java,Arraylist,我有这样一个对象的数组列表:[对象1,对象2,null,null,…,null,对象3,null,null] 我尝试在对象2之后移动对象3,但不删除“null case”,但它不起作用。所以我想从右到左迭代我的arrayList,检查值是否为null,然后将对象3移到对象2后面。我确实不知道对象2和对象3之间的“null case”的数目 我试着这样写: ArrayList<Type> subList = new ArrayList<Type>(); for (int

我有这样一个对象的数组列表:[对象1,对象2,null,null,…,null,对象3,null,null]

我尝试在对象2之后移动对象3,但不删除“null case”,但它不起作用。所以我想从右到左迭代我的arrayList,检查值是否为null,然后将对象3移到对象2后面。我确实不知道对象2和对象3之间的“null case”的数目

我试着这样写:

ArrayList<Type> subList = new ArrayList<Type>();

for (int i = 0; i < array.size(); i++) {
    subList = array.get(i);
    for (int j = subList.size(); j >=0 ; j--) {
        if(subList.get(j)!=null) {
            Collections.swap(subList, j, j-1);
        }                       
    }
}
ArrayList子列表=新建ArrayList();
对于(int i=0;i=0;j--){
if(subList.get(j)!=null){
集合交换(子列表,j,j-1);
}                       
}
}
编辑:

解决方案1:这适用于我的项目

for(int i=0;i<subList.size();i++)
    if(subList.get(i)!=null) {
        for(int j=0;j<i;j++) {
            if (subList.get(j)==null) {
                Collections.swap(subList,i,j);
                break;
            }
        }
    }
}

for(int i=0;i更新2:

要在不创建任何新列表的情况下在对象之间交换,请使用Collections.swap();类似以下内容:

public static void main(String[] args) {

    ArrayList subList = new ArrayList();
    subList.add("1");
    subList.add("2");
    subList.add(null);
    subList.add(null);
    subList.add("3");

    for(int i=0;i<subList.size();i++)
        if(subList.get(i)!=null) {
            for(int j=0;j<i;j++) {
                if (subList.get(j)==null) {
                    Collections.swap(subList,i,j);
                    break;
                }
            }
        }
    }
}
publicstaticvoidmain(字符串[]args){
ArrayList子列表=新的ArrayList();
子列表。添加(“1”);
子列表。添加(“2”);
subList.add(空);
subList.add(空);
子列表。添加(“3”);

因为(inti=0;i我头脑中的解决方案并不聪明,但它能让你们保持秩序

int nullIndex = -1;
for (int i = 0; i < list.size(); i++) {
    if (nullIndex==-1 && list.get(i) == null) {
        System.out.println("nullIndex ="+i);
        nullIndex = i;
    } else if (nullIndex >= 0 && list.get(i) != null) {
        System.out.println("swap ="+i+" "+nullIndex);

        list.set(nullIndex, list.get(i));
        list.set(i, null);
        i = nullIndex;
        nullIndex=-1;
    }
}

为什么不对ArrayList进行排序呢?事实上,我希望保留所有空的“大小写”,并将它们放在ArrayList的末尾。只需这样做:迭代列表,删除每个空元素(记住删除了多少个),然后在列表末尾重新添加N null。其目的可能是修改给定的列表,而不是创建新的列表。@Marco13检查我的第二次更新。到目前为止,这里建议的解决方案都有O(nlogn)甚至O(N*N)。我刚刚投票,因为这似乎是最简洁有效的解决方案。谢谢!使用此方法的工作:)@用户3748551欢迎您
public static void main(String[] args) {
    ArrayList subList = new ArrayList();
    subList.add("1");
    subList.add("2");
    subList.add(null);
    subList.add(null);
    subList.add("3");
    subList=leftShift(subList);
}

public static ArrayList leftShift(ArrayList x){
    ArrayList temp=new ArrayList();
    int count=0;
    for(Object t:x){
        if(t!=null)
            temp.add(t);
        else
            count++;
    }
    for (int i=0;i<count;i++)
        temp.add(null);
    return temp;
}
int nullIndex = -1;
for (int i = 0; i < list.size(); i++) {
    if (nullIndex==-1 && list.get(i) == null) {
        System.out.println("nullIndex ="+i);
        nullIndex = i;
    } else if (nullIndex >= 0 && list.get(i) != null) {
        System.out.println("swap ="+i+" "+nullIndex);

        list.set(nullIndex, list.get(i));
        list.set(i, null);
        i = nullIndex;
        nullIndex=-1;
    }
}
int counter=0;
while(subList.contains(null)){
    subList.remove(null);
    counter++;
};
while(counter>0){
    subList.add(null);
    counter--;
}