Java 将arraylist中的特定元素移动到最后一个索引

Java 将arraylist中的特定元素移动到最后一个索引,java,Java,假设我有这个清单 List<Integer> grades = Arrays.asList(9,8,1,0,7,0,0,3); 我可以用简单的数组来实现这一点,但我仍然不知道如何在ArrayList中实现这一点。您可以使用,将所有0移到最后,而不是对剩余值进行排序 grades.sort(Comparator.comparing(value -> value == 0 ? 1 /* sort last */ : 0 /* don't sort */)); //[9, 8,

假设我有这个清单

List<Integer> grades = Arrays.asList(9,8,1,0,7,0,0,3);

我可以用简单的数组来实现这一点,但我仍然不知道如何在ArrayList中实现这一点。

您可以使用,将所有
0
移到最后,而不是对剩余值进行排序

grades.sort(Comparator.comparing(value -> value == 0 ? 1 /* sort last */ : 0 /* don't sort */));  //[9, 8, 1, 7, 3, 0, 0, 0]

如注释中所述,您可以通过使用
列表
get
set
方法而不是
[]
操作符来重用数组中的相同代码

另一种“偷偷摸摸”的方法可能是利用排序保持两个相等元素的相对位置这一事实,并使用自定义的
比较器对列表进行排序,比较器根据项目是否等于
0
-所有的零将移到末尾,所有其他项目将保持其相对位置:

grades.sort(Comparator.comparing(i->i==0));
要实现比使用O(n log(n))
sort()解决方案更快的O(n)实现,请使用与阵列相同的方法:

intj=0;
用于(整数值:等级){
如果(值!=0){
等级设置(j++,值);
}
}
而(j
当然,如果不是
ArrayList
,那么使用
set(int,?)
可能会对性能造成不良影响,因此最好使用可更新的迭代器,即
ListIterator

ListIterator iter=grades.ListIterator();
用于(整数值:等级){
如果(值!=0){
iter.next();//无需先调用hasNext()
iter.set(值);
}
}
while(iter.hasNext()){
iter.next();
iter.set(0);
}
为了进行比较,以下是可比较的阵列解决方案:

int[]等级={9,8,1,0,7,0,0,3};
int j=0;
对于(int i=0;i
谢谢各位

我用与使用简单阵列相同的方法实现了这一点:


 List<Integer> price = Arrays.asList(9,8,1,0,7,0,0,3);
       
        
        int count = 0;
        
        
        for(int i=0; i<price.size(); i++) {
            if(price.get(i) !=0) {
                
                price.set(count++, price.get(i));   
                
            }
            
        }
             while(count<price.size()) {
                price.set(count++, 0);
             
                
             }
            System.out.print(Arrays.toString(price.toArray()));
        }


标价=数组.asList(9,8,1,0,7,0,0,3);
整数计数=0;

对于(int i=0;i“我可以用简单数组来做这件事”这基本上是一样的,只要使用正确的方法
get
,使用正确的方法
set
(提示)List price=arrays.asList(9,8,1,0,7,0,0,3);int count=0;对于(inti=0;提取器的语义不是很明显,我需要一个注释(或者更好的是,一个命名常量)如果我在code review中看到了这一点。对不起,你让我用正确的名称命名
I
?你能详细说明你的评论吗?@chrylis-cautiouslyoptimistic-我认为使用
I
可能会产生误导,因为这通常是索引变量的名称。也许使用
value
,或者更短的
v
,会使逻辑更清晰。也许您也可以添加注释,但我认为这太过分了,例如,
比较(value->value==0?1/*最后排序*/:0/*先排序*/)在我看来,为1和0值创建常量肯定是多余的,所以我不同意CryLIS。代码风格NITPoice:<代码>值>值< /Code >看起来像C++指针引用(箭头操作符)。。请在运算符周围使用空格,尤其是在该运算符周围,即
value->value==0
@chrylis小心光学-目标是“最后为零”,所以我想知道你是否将函数命名错误,但是你实际上翻转了0和1,所以…令人困惑…这取决于不明显的细节,即
TRUE
被认为更大,因此排序比,
FALSE
@chrylis谨慎的光学-这是
Boolean
排序
FALSE
的自然顺序是fore
true
@Andreas这肯定是有文档记录的。这无疑是一个聪明的把戏,将零转化为谓词并对其排序,这足够聪明,值得解释。@chrylis谨慎地选择-同意。在这种情况下,聪明(非常好,我投赞成票)可能会让大多数人感到困惑,至少在一段时间内是这样,所以这样的评论可能会很好:
//排序0的最后一个,因为true排序最后一个

 List<Integer> price = Arrays.asList(9,8,1,0,7,0,0,3);
       
        
        int count = 0;
        
        
        for(int i=0; i<price.size(); i++) {
            if(price.get(i) !=0) {
                
                price.set(count++, price.get(i));   
                
            }
            
        }
             while(count<price.size()) {
                price.set(count++, 0);
             
                
             }
            System.out.print(Arrays.toString(price.toArray()));
        }