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 ;
};
逻辑很简单:
- 确定
clearnArray
应该有多大。
- 使用 .trim() 遍历原始数组以删除白色 Space 并检查是否为 isEmpty()。
- 如果索引不为空,则添加到
k
。
- 创建
clearnArray
,大小为 k
。
- 循环原始数组直到
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 中使用流媒体功能,所以我无能为力。
注意两点:
除非您正在序列化或空值导致其他问题,否则修剪数组只是为了摆脱空值可能不会对内存产生影响,因为数组条目的大小 ( 4 字节)很可能与为 Array 对象分配的内存块大小无关紧要
先转换为 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)
我有一个数组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 ;
};
逻辑很简单:
- 确定
clearnArray
应该有多大。 - 使用 .trim() 遍历原始数组以删除白色 Space 并检查是否为 isEmpty()。
- 如果索引不为空,则添加到
k
。 - 创建
clearnArray
,大小为k
。 - 循环原始数组直到
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 中使用流媒体功能,所以我无能为力。
注意两点:
除非您正在序列化或空值导致其他问题,否则修剪数组只是为了摆脱空值可能不会对内存产生影响,因为数组条目的大小 ( 4 字节)很可能与为 Array 对象分配的内存块大小无关紧要
先转换为
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)