如将字符串"A1B2C3D4E5F6G7H8",通过split(“[A-Z]”)处理后,得出的字符串数组,想将此数组转成Int类型数组,但由于存在空串导致出现NumberFormatException。搜索了一些处理方案,如split("[A-Z]",StringSplitOptions.RemoveEmptyEntries),但是我这并没有这个StringSplitOptions,所以调用不了。
想知道除了循环之外,有没有其他的方式来解决这个问题?
String s = "A1B2C3D4E5F6G7H8";
// System.out.println(s);
// String[] split = s.split("\\D");
// System.out.println(split.toString());
// int[] ints = Arrays.stream(s.split("\\D")).mapToInt(i -> Integer.parseInt(i)).toArray();
// String[] sarr = s.split("\\d");
// System.out.println(ints);
// Arrays.stream(sarr).forEach(System.out::print);
// String[] st = new String[]{"a","b","c","d"};
// System.out.println();
System.out.println(s);
String[] sp = s.split("[A-Z]");
Arrays.stream(sp).forEach(System.out::println);
// System.out.println(sp.length);
int[] intarr = new int[]{};
for (int is = 0;is < sp.length;is++){
intarr[is] = Integer.valueOf(sp[is]);
}
// Arrays.stream(sp).forEach(System.out::print);
Arrays.stream(intarr).forEach(System.out::println);
A1B2C3D4E5F6G7H8
1
2
3
4
5
6
7
8
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.valueOf(Unknown Source)
at sevtnthForBookTest.subTest.main(subTest.java:31)
数组类型由String 转变为Int
这是String.split()的一段注释:
* When there is a positive-width match at the beginning of this
* string then an empty leading substring is included at the beginning
* of the resulting array. A zero-width match at the beginning however
* never produces such empty leading substring.
大意为:当给定字符串的开头匹配到正则的时候,一个空字符串将作为array的第一个元素。如果开头没有匹配到正则,则不会存在空字符串。
你的输入: "A1B2C3D4E5F6G7H8",开头A匹配到拆分正则,所以数组开头为空字符串,可以加个判断:
如果s的开始就匹配拆分正则,则丢弃拆分后array的第一个元素,否则正常处理就行了,不过仅适用于没有连续[A-Z]的情况。
也可以这样处理:
public static void main(String[] args) throws Exception {
String s = "A1B2C3D4E5F6G7H8";
s = 0 + s;
String[] split = s.split("[A-Z]");
int[] intarr = new int[split.length-1];
for (int i = 1; i < split.length; i++) {
intarr[i-1] = Integer.valueOf(split[i]);
}
}
当然最稳妥的还是在转Integer之前加个空字符串的判断哈。
public static void main(String[] args) {
String s = "A1B2C3D4E5F6G7H8";
System.out.println(s);
String[] sp = s.split("[A-Z]");
List<String> numsList = new ArrayList<>();
for(String ss : sp) {
if(!"".equals(ss)){
numsList.add(ss);
}
}
int[] intarr = new int[numsList.size()];
for (int is = 0;is < intarr.length;is++){
intarr[is] = Integer.valueOf(numsList.get(is));
}
System.out.println(Arrays.toString(intarr));
}
在Integer.valueOf
前面加一个判空操作,split只有去除数组尾部空字符串的参数,不能去除数组前几位的空字符串。
for (int is = 0;is < sp.length;is++){
if (sp[is].isEmpty()){
intarr[is]=0;
}else {
intarr[is] = Integer.valueOf(sp[is]);
}
}
过滤下空字符串
String s = "A1B2C3D4E5F6DDG7H8";
String[] sp = s.split("[A-Z]+");
int[] intarr= Arrays.stream(sp).filter(item -> item != null && !item.equals("")).mapToInt(Integer::valueOf).toArray();