从列表中删除数字

uujelgoq  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(284)

我想从列表中删除值255,就像 a 或者 b 或者 c 或者 d 等于 255 我想把它排除在名单之外。我试过了 //list.removeAll (Collections.singletonList ("255")); 但它不起作用。当我将list的值与collection.max(list)进行比较时,如果其中一个值等于它,我想排除255。

List<Float> list = new ArrayList<Float>();

list.add(a);
list.add(b);
list.add(c);
list.add(d);

if ( a>=15||b>=15||c>=15||d>=15) {
    if ( Collections.max(list) == a) {
        Defauts_detecteur.setText("Défauts récurrents constatés sur le détecteur 1");
    }else if (Collections.max(list)==b)
    {
        Defauts_detecteur.setText("Défauts récurrents constatés sur le détecteur 2");}
    else if (Collections.max(list)==c)
    {
        Defauts_detecteur.setText("Défauts récurrents constatés sur le détecteur 3");}
    else
    {
        Defauts_detecteur.setText("Défauts récurrents constatés sur le détecteur 4");}

    Conseil_detecteur.setText("--> Par mesure de sécurité, nous vous conseillons vivement de vérifier que le détecteur est bien collé au produit à sécuriser.\nPour une adhésion optimale, remplacez l’adhésif.\nVérifiez que le détecteur est bien connecté à la centrale et qu’il est en bon état.");

}
4xrmg8kj

4xrmg8kj1#

创建的arraylist是浮点类型。所以下面的代码片段将删除255f的所有出现

list.removeAll(Collections.singleton(255f));

下面是我自己尝试的代码片段

List<Float> list = new ArrayList<Float>();  
list.add(1.0f);  
list.add(2.0f);  
list.add(255.0f);  
list.add(3f);  
list.add(255f);  
System.out.println(list.toString());  
//output [1.0, 2.0, 255.0, 3.0, 255.0]
list.removeAll(Collections.singleton(255f));  
System.out.println(list.toString());  
//output [1.0, 2.0, 3.0]
vxbzzdmp

vxbzzdmp2#

主要的问题(我猜有一点)是你试过了 .remove(255) 但它不起作用。
那是因为一个不幸的怪癖。这个代码看起来非常简单:

float a = 5;

List<Float> list = new ArrayList<Float>();
list.add(a);
list.remove(5.0);
// or even
list.remove(5);

上面的代码被破坏了。它编译得很好。它运行得很好(好吧,最后一个在运行时抛出一个奇怪的错误消息,如果你不明白发生了什么)。尽管如此,你的名单上仍然有 5.0 一旦它运行了???这是怎么回事??

怎么回事?

有两个 list.remove 方法:一种是按值删除(传递值:列表将搜索它包含的所有内容以查找该值并将其删除),另一种是按索引删除第9个值。它们在参数类型上是不同的:“remove by value”接受一个对象,“remove by index”接受一个int remove ? 它是 int ,或 Object ?
当你写作的时候 .remove(5) ,您正在按索引删除。当你有一个数字列表的时候会变得很复杂, .remove(5) 模棱两可:你的意思是:删除第5个数字,还是:删除第5个数字?
这种混乱解释了原因 .remove(5) 无法完成任务。java总是将其解释为:按索引删除。即使是一个 List<Integer> ,它会这样做。
然后是自动装箱。java需要将原语转换为对象,以便调用remove by value变量。 5.0 转换为双精度。这也是一个物体。这看起来很奇怪,但你可以要求一个名单猫删除某只狗:名单只会去:哦,好的。什么也不做。它不会抛出异常,它允许您编写异常。对比添加:你不能写 List<Cat> cats = ...; cats.add(new Dog()) . 但你可以写 cats.remove(new Dog()) 很好,根据这个理论,要求一个列表删除一些甚至不在其中的东西是很好的,并且是通过不做任何事情来完成的。
这就解释了为什么 list.remove(5.0) 编译、运行并不执行任何操作:它要求删除值为5.0的double,而您的列表中没有该值。它有一个值为5.0的float,而java并不将其视为相同的值。
你在做什么 .remove("5") 更奇怪的是,字符串“5”与double或float 5完全无关。java不会试图将表示同一事物的不同概念合并在一起( "5" , 5F , 5D 以及 5 都是不同的东西)。

如何修复

停止使用浮动。改用double。浮动几乎从来没有一个好的理由:它们更小的事实很少会真正发生(64位体系结构就是这样),如果它发生了,那么在微小的带宽中,节省一个浮动是值得的,这是非常罕见的,但是重写代码以使用一种完全避免浮点运算的算法是不可能的。double是java中的一等公民,float不是。例如, 255.0 是双人房。不是浮子。
接下来,围绕以下事实跳舞 .remove 有点傻。投射到对象以确保:

List<Integer> x = new ArrayList<Integer>();
list.add(2, 1, 0);
list.remove(0); // this removes the 2!!! Because that is the item at index 0
list.remove((Object) 0); // this really does remove the 0.
System.out.println(list);
> [1]

最后,确保要删除的内容与列表中的内容相匹配。如果你有一个浮动列表,里面有255个,那就是 255F . 不是 255 ,不是 255.0 (这是双人房)。 255D 以及 255.0 不过,它们是一样的:

List<Double> list = new ArrayList<Double>();
list.add(255.0);
list.remove(255.0); // this works
list.remove(255); // this doesn't
list.remove((Object) 255); // this removes nothing! 255 isn't the same as 255.0.

相关问题