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
的自然顺序是foretrue
@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()));
}