【问题标题】:Java: Removing an empty Element from String Array [duplicate]Java:从字符串数组中删除一个空元素[重复]
【发布时间】:2020-01-14 14:20:57
【问题描述】:

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

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

我想知道如何删除索引 1 - > 上的空白空间,但也将其保留为字符串数组,因为它是下一个任务所必需的。或者如何进行一堆转换,但最终以字符串数组结束。

我的尝试

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. 使用k 作为大小创建clearnArray
  5. 循环遍历原始数组直到k -> 将所有项目添加到cleanArray 直到k

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

【问题讨论】:

  • 这个String ar[] = ["HalloWelt",]; 无效。你的数组是如何初始化的?
  • 字符串内容 = new String(Files.readAllBytes(path), Charset.defaultCharset());字符串 [] 数据 = content.split(",\\R");内容 -> 从文件信息块中读取。此块通常由“,”划分,最后一个也没有任何信息 - >这是空白的来源。
  • 不清楚是否要 (a) 调整数组大小以排除空白字符串,(b) 将空白字符串转换为空字符串,(c) 将空白字符串转换为空

标签: java arrays string is-empty


【解决方案1】:

streams的解决方案:

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

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

.filter(Objects::nonNull)

【讨论】:

【解决方案2】:

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

可以使用“增强”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;

【讨论】:

  • 谢谢你的回答!!!
【解决方案3】:

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

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 可能会在其内部创建的数组中包含额外的空间,以便您可以向 ArrayList 添加更多元素,而不必创建一个全新的内部数组。

【讨论】:

  • 谢谢你的回答!!!
【解决方案4】:

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

List cleanedList = new ArrayList();

add 遍历 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();

【讨论】:

  • 谢谢你的回答!!!
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2020-02-05
  • 1970-01-01
  • 2021-10-15
相关资源
最近更新 更多