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

时间:2020-01-14 14:20:57

标签: java arrays string is-empty

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

它确实在索引0的“ HalloWelt”中注册了两个值,并在索引1上注册了一个空白/空字符串;

我想知道如何删除索引1->上的空白空间,但又将其保留为String Array,因为下一个任务必须这样做。或如何进行大量转换,但最终还是得到String Array。

我的尝试

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()遍历原始数组以删除空白并检查是否为isEmpty()。
  3. 如果索引不为空,则添加到k
  4. 使用clearnArray作为大小创建k
  5. 遍历原始数组直到k->将所有项添加到cleanArray直到k

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

4 个答案:

答案 0 :(得分:1)

使用streams的解决方案:

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

请注意,这假设所有数组元素都不是null。如果可能的话,只需在map之前添加以下步骤:

.filter(Objects::nonNull)

答案 1 :(得分:0)

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

List cleanedList = new ArrayList();

通过ar [] ar [] = [“ HalloWelt”,“”]进行迭代,然后仅将非空值添加到已清理的List...。然后返回该数组。

return cleanedList.toArray()

如下所示:

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

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

return cleanArray.toArray();

答案 2 :(得分:0)

您的代码存在的问题是,在计数找到k之后,您只需编写原始数组中的前k个元素。为了通过您的技术解决问题,您需要再次检查输入数组的每个元素以查看其是否为空(修剪后),然后仅将通过测试的元素写入新数组。

可以使用“增强型” for循环来简化代码,因为您不需要原始数组的索引。 (变量i跟踪 new 数组中的当前索引。)另请注意,字符串是不可变的,因此如果不使用结果随处可见。您的代码还引用了未定义的.trim(),所以我更改了它。

bsp

答案 3 :(得分:0)

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

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. 除非您要序列化或null导致其他问题,否则修剪数组只是为了摆脱null可能不会对内存造成影响,因为数组条目的大小(4个字节)为很有可能与分配给Array对象的内存块大小无关紧要

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