Java:移除字符串数组非数字字符并返回排序逗号分隔字符串求优化
优化建议及改进代码
你的实现逻辑通顺,但可以从空值安全、代码简洁性、内存效率这几个维度优化,下面是具体的改进点和代码:
核心优化点
- 空值处理:原代码直接拼接
null会生成字符串"null",后续虽会过滤非数字,但属于无效操作,应先判断元素是否为null再处理 - 减少中间冗余对象:原代码先拼接所有字符串再过滤数字,会生成大的中间字符串;改为逐个处理每个字符串的字符,直接收集数字,减少内存占用
- 简化收尾拼接:用
String.join()替代手动循环拼接逗号分隔的字符串,代码更简洁 - 利用Stream API简化流程:Java 8+的Stream可以把整个流程串联起来,避免多层嵌套循环,可读性更强
改进后的代码(Stream版本)
import java.util.Arrays; import java.util.stream.Collectors; class Test { private static String sortedStringOfNumber(String[] strings) { return Arrays.stream(strings) // 过滤null元素,避免无效处理与空指针 .filter(s -> s != null) // 将每个字符串拆分为字符流 .flatMapToInt(String::chars) // 只保留数字字符 .filter(Character::isDigit) // 转成int类型的数字 .map(c -> c - '0') // 升序排序 .sorted() // 转成字符串 .mapToObj(String::valueOf) // 用逗号加空格拼接成最终字符串 .collect(Collectors.joining(", ")); } public static void main(String[] args) { String[] arrayStringData = new String[] { "1", "ab3c", "level", null, "java2s.com", "asdf 456", "Br0C0de" }; // 输出:0, 0, 1, 2, 3, 4, 5, 6 System.out.println("Sorted string of numbers ->\t" + sortedStringOfNumber(arrayStringData)); } }
改进后的代码(传统循环版本)
如果不想用Stream,也可以优化传统实现:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; class Test { private static String sortedStringOfNumber(String[] strings) { // 先收集所有数字,避免生成大的中间字符串 List<Integer> numberList = new ArrayList<>(); for (String s : strings) { if (s == null) continue; for (char c : s.toCharArray()) { if (Character.isDigit(c)) { numberList.add(c - '0'); } } } // 转数组并排序 int[] numbers = new int[numberList.size()]; for (int i = 0; i < numbers.length; i++) { numbers[i] = numberList.get(i); } Arrays.sort(numbers); // 用String.join简化拼接 String[] numberStrings = new String[numbers.length]; for (int i = 0; i < numbers.length; i++) { numberStrings[i] = String.valueOf(numbers[i]); } return String.join(", ", numberStrings); } public static void main(String[] args) { String[] arrayStringData = new String[] { "1", "ab3c", "level", null, "java2s.com", "asdf 456", "Br0C0de" }; System.out.println("Sorted string of numbers ->\t" + sortedStringOfNumber(arrayStringData)); } }
关键细节说明
- 空值过滤:提前过滤
null元素,既避免了无效的字符串拼接,也防止后续字符处理时抛出空指针异常 - 字符级处理:直接遍历每个字符串的字符收集数字,比先拼接整个大字符串再过滤的内存效率更高,尤其适合处理大数组
- 简化拼接:
String.join()是JDK提供的工具方法,比手动写循环拼接更简洁且不易出错 - 兼容低版本JDK:如果使用Java 8以下版本,用传统循环收集数字即可,核心逻辑和优化点一致
内容的提问来源于stack exchange,提问作者Orest Dymarchuk
相关产品推荐
相关产品推荐

