Java: 从字符串数组中删除一个空元素

Java: Removing an empty Element from String Array

我有一个数组String ar[] = {"HalloWelt", " "};,ar.length是2.

它确实在索引 0 上的 "HalloWelt" 中注册了两个值,在索引 1 上注册了一个 blank/empty 字符串;

我想知道如何删除索引 1 -> 上的空 space,同时将其保留为字符串数组,因为它是下一个任务所必需的。或者如何进行大量转换,但最终得到字符串数组。

我的尝试

public String[] arraysWhiteSpaceEliminator(String[] arr) {

        int k=0;   //Identify how big the array should be i.e. till it reaches an empty index.

        for(int i=0; i<bsp.length;i++) {
            arr[i].trim();
            System.out.println(arr[i].isEmpty());
            if(arr[i].isEmpty()) {
            }
            else {
                k = k+1; //if the index isn't empty ==  +1;
            }

        }

        String[] clearnArray = new String[k];
        for(int s = 0; s<k; s++) {
            clearnArray [s] = arr[s];  //define New Array till we reach the empty index.
            //System.out.println(clearnArray [s]+" " +s); 
        }

        return clearnArray ;

    };

逻辑很简单:

  1. 确定 clearnArray 应该有多大。
  2. 使用 .trim() 遍历原始数组以删除白色 Space 并检查是否为 isEmpty()。
  3. 如果索引不为空,则添加到 k
  4. 创建 clearnArray,大小为 k
  5. 循环原始数组直到 k -> 将所有项目添加到 cleanArray 直到 k.

问题:.trim() 和 .isEmpty() 不记录索引为空。 ?!

在您的方法中,创建一个新的

List cleanedList = new ArrayList();

通过 ar[]ar[] = ["HalloWelt",""] 添加迭代,并仅将非空值添加到已清理的列表....然后 return 数组。

return cleanedList.toArray()

如下所示:

List<String> cleanedList = new ArrayList<>();

for(String s : arr) {
    s = s.trim();
    if(!s.isEmpty()) {
        cleanedList.add(s);
    }
}

return cleanArray.toArray();

你的代码的问题在于,在计算找到 k 之后,你只写了原始数组中的前 k 个元素。要用你的技术解决这个问题,你需要再次检查输入数组的每个元素,看它是否为空(修剪后),并且只将通过测试的元素写入新数组。

可以使用 "enhanced" for 循环简化代码,因为您不需要原始数组的索引。 (变量 i 跟踪 new 数组中的当前索引。)另请注意,字符串是不可变的,因此调用 .trim() 不会执行任何操作不要在任何地方使用结果。您的代码还引用了未定义的 bsp,所以我更改了它。

int k = 0;

for(String s : arr) {
    s = s.trim();
    if(!s.isEmpty()) {
        k++;
    }
}

String[] cleanArray = new String[k];
int i = 0;
for(String s : arr) {
    s = s.trim();
    if(!s.isEmpty()) {
        cleanArray[i] = s;
        i++;
    }
}

return cleanArray;

计算非空元素的数量并创建该大小的数组,如

String[] strs = ...;
int count = 0;
for (int i = 0; i < strs.length; i++) {
  if (strs[i] != null) count++;
}
String newStrArray[] = new String[count];
int idx = 0;
for (int i = 0; i < strs.length; i++) {
  if (strs[i] != null) newStrArray[idx++] = strs[i];
}
return newStrArray;

您也可以使用流使它更漂亮。但是我没有在 Java 中使用流媒体功能,所以我无能为力。

注意两点:

  1. 除非您正在序列化或空值导致其他问题,否则修剪数组只是为了摆脱空值可能不会对内存产生影响,因为数组条目的大小 ( 4 字节)很可能与为 Array 对象分配的内存块大小无关紧要

  2. 先转换为 List 然后再转换回数组是懒惰的,而且可能效率低下。例如,ArrayList 可能会在其内部创建的数组中包含额外的 space,这样您就可以向 ArrayList 添加更多元素,而不必创建一个全新的内部数组。

streams的解决方案:

String[] clean = Arrays.stream(ar)
    .map(String::trim)
    .filter(Predicate.isEqual("").negate())
    .toArray(String[]::new);

请注意,这假设数组元素中的 none 是 null。如果这是可能的,只需在 map:

之前添加以下阶段
.filter(Objects::nonNull)