2

我有一个包含以下元素的字符串数组

5.0,99,5.5,100,6.0,101

现在我想做的是删除字符串格式的所有十进制值,例如5.0,5.56.0

所以我的最终数组应该包含元素99,100,101

所以到目前为止我所做的是显示在下面的代码中

public static String[] deleteElement(String[] str_array) {
        //String[] str_array = {"item1","item2","item3"};
        List<String> list = new ArrayList<String>(Arrays.asList(str_array));
        
        list.remove("5.0");
        list.remove("5.5");
        list.remove("6.0");
        return str_array = list.toArray(new String[0]);
    }

我对这些值进行了硬编码,这是非常糟糕的做法,因为将来的值可能会超过当前值,所以我想要一种通过使用index.

我也尝试使用remove(index)0,2,4 之类的索引定位来删除,但实际发生的是,在删除 后5.0,元素向左移动,因此 100 进入第二个位置,并在下一次迭代中删除 100。

那么有什么方法可以构造一个通用函数,所以如果十进制值中有更多元素,那么它也可以被删除。

注意:字符串十进制值将始终驻留在偶数索引位置。

4

6 回答 6

2

您可以使用以下方法,它对我来说很好!

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DecimalRemoval {
    public static void main(String[] args) {
        
        List<String> lst = Arrays.asList("5.0","99","5.5","100","6.0","101");
        List<String> resultant = new ArrayList<>(lst.size());
        
        for(String element: lst) {
            if(! element.contains("."))
                resultant.add(element);
        }
        
        System.out.println(resultant);
    }
}

在此处输入图像描述

还附上我工作区的屏幕截图。

于 2020-10-10T14:18:28.280 回答
2

我们已经遍历了Listlist.size() -10
所以那个数字没有被推到前面。
当您从0to遍历它时size of the list,如果您删除一个元素,则1元素会被跳过size(),因为列表会减少并i不断增加。
eg.["5.0","6.1","5.5","100","6.0","6.6"] 当你遍历 form0size() - 1
i = 0 时:
5.0被看到并删除,然后列表就像["6.1","5.5","100","6.0","6.6"]现在6.1的位置0指数。

i = 1:
5.5被删除,然后列表就像
["6.1","100","6.0","6.6"]现在1001索引处一样。

等等。

size-1但是当从to遍历时,0它将删除每个元素,而不必担心丢失任何decimal数字。
自己尝试一下,您就会知道它为什么起作用以及为什么0不起作用n-1

            String arr[] = {"5.0","99","5.5","100","6.0","101"};
            List<String> list = new ArrayList<String>(Arrays.asList(arr));
            for(int i = list.size() - 1 ; i >= 0 ; i--) {
                String number = list.get(i);
                if(number.contains(".")) {
                    list.remove(number);
                }
            }
            
            for(String val : list) {
                System.out.println(val);
            }

输出:

99
100
101
于 2020-10-10T14:23:06.863 回答
2

现有答案有效,但比要求的更冗长:

list.removeIf(str -> str.contains("."));
于 2020-10-10T14:36:16.923 回答
2

您也可以只流式传输数组并过滤掉不需要的值。

String[] v = {"5.0","99","5.5","100","6.0","101"};
v = Arrays.stream(v)
        .filter(str->!str.contains("."))
        .toArray(String[]::new);


System.out.println(Arrays.toString(v));

印刷

[99, 100, 101]
于 2020-10-10T19:14:27.777 回答
1

一个简单的解决方案可以是:

  1. 实例化一个ArrayList<String>.
  2. 导航数组并将元素添加到列表中,如果它不包含.
  3. 最后将列表转换为数组并返回相同的值。

演示:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static String[] deleteElement(String[] str_array) {
        List<String> list = new ArrayList<>();
        for (String s : str_array) {
            if (!s.contains(".")) {
                list.add(s);
            }
        }

        return list.toArray(new String[0]);
    }

    public static void main(String[] args) {
        // Test
        System.out.println(Arrays.toString(deleteElement(new String[] { "5.0", "99", "5.5", "100", "6.0", "101" })));
    }
}

输出:

[99, 100, 101]

或者,您可以按照您已经在做的方式进行操作,但这不是那么有效的方式。由于您首先将所有元素添加到列表中,然后删除不需要的元素,因此它不如上面建议的那样有效。

public static String[] deleteElement(String[] str_array) {
    List<String> list = new ArrayList<String>(Arrays.asList(str_array));
    for (String s : str_array) {
        if (s.contains(".")) {
            list.remove(s);
        }
    }

    return list.toArray(new String[0]);
}
于 2020-10-10T14:20:58.940 回答
0

对于 Java 8 用户,最好的解决方案是使用 Java lambda 表达式

list.removeIf(element -> element.contains("."));
于 2020-10-11T11:41:44.447 回答