有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java7中,数组从ArrayList中删除备用元素

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

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被删除

有没有办法构造一个泛型函数,如果十进制值中有更多的元素,那么它也可以被删除

注意: 字符串十进制值将始终位于偶数索引位置


共 (6) 个答案

  1. # 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]);
    }
    
  2. # 2 楼答案

    我们已经穿过了Listlist.size() -10
    所以这个数字不会排在前面
    当你从0遍历到size of the list然后如果你删除一个元素1元素被跳过,因为列表中的size()减少i不断增加
    例如,“5.0”、“6.1”、“5.5”、“100”、“6.0”、“6.6”] 当你遍历0size() - 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"]其中现在100位于1索引

    等等

    但是当从size-1遍历到0时,它将删除每个元素,而不必担心丢失任何decimal数字
    自己尝试一下,你就会知道为什么它会起作用,为什么0n-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
    
  3. # 3 楼答案

    现有答案有效,但比要求的更详细:

    list.removeIf(str -> str.contains("."));
    
  4. # 4 楼答案

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

    list.removeIf(element -> element.contains("."));
    
  5. # 5 楼答案

    也可以将数组流化,过滤掉不需要的值

    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]
    
  6. # 6 楼答案

    你可以用下面的方法,它对我很好

    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);
        }
    }
    

    enter image description here

    还附上了我工作区的截图