提问人:Grismak 提问时间:11/10/2023 最后编辑:Grismak 更新时间:11/13/2023 访问量:79
更改不带 if 语句的 String 的值
Change value of String without if statement
问:
我需要将 String 数组 (String []) 的几个值转换为 Int,如果可能的话,我想避免不必要的代码。
这是我所做的事情的一个例子。
我读了一行CSV文件 示例:
11;;000000000000000;2023-01-01;000;600;021;3008577;*********C;OPTIONAL;1005698;555;25;43;59999;0.00;0.00;0.00;S
;********E;000000000000000;2023-01-01;000;600;021;3008577;*********C;OPTIONAL;1005698;555;25;43;59999;0.00;0.00;0.00;N
我这样做(读取文件并不重要,所以让我们跳过它):
for (String fileSingleLine: contentFile) {
String[] line = fileSingleLine.split(";");
finalContent.append(customDTO.setLineValues(line).append("/n");
}
在我的赋值器内部,我需要将第一个值(可以是数字或空字符串)转换为带有简单
Integer.valueOf(line[0])
这显然会抛出一个 NumberFormatException,所以我必须首先检查字符串是否为 Empty 并执行以下操作:
int values;
if(line[O].isEmpty()) {
values = 0;
} else {
values = Integer.valueOf(line[0]);
}
有没有办法避免三元运算符和 if else 语句?
PD:在对超过 100K 行的文件进行了一些基准测试后,我使用 concat 选项而不是 if-else 选项获得了大约 30% 的改进。我在两次尝试之间应用的代码中的唯一更改是以下更改:
// if (StringUtils.isBlank(line[0])) {
// contenido.append(Integer.valueOf("0"));
// } else {
// contenido.append(Integer.valueOf(line[0]));
// }
contenido.append(Integer.valueOf("0".concat(line[0]).trim()));
从文件上看,第一个对象之间的顺序是清空的,并且具有值是随机的,以避免预测器算法。
答:
1赞
Rifat Rubayatul Islam
11/10/2023
#1
我能想到两种方法可以在没有 if-else 或三元的情况下做到这一点。但我不建议任何人使用它们。他们只是为了满足好奇心。
1. 使用try-catch
int values;
try {
values = Integer.parseInt(line[0]);
} catch (NumberFormatException e) {
values = 0;
}
System.out.println(values);
2. 字符串连接
int values = Integer.parseInt(line[0]+"0")/10;
System.out.println(values);
最后附加,以便负数不会引起任何问题。0
评论
0赞
Grismak
11/10/2023
真的很有趣,我会用 concat 试用第二个版本,我认为它可以更快
0赞
Rifat Rubayatul Islam
11/10/2023
不过@Grismak小心。如果数字大于或小于 ,则将创建第二种方法。因为在那之后添加意味着它不再适合NumberFormatException
214748364
-214748364
0
int
0赞
Grismak
11/13/2023
是的,如果我得到负数、null 或更大的数字可以抛出异常(文件是坏的),这个值是非常具体的,所以这是一个极端情况,但这个观点非常值得赞赏
0赞
Grismak
11/13/2023
int 值 = Integer.valueOf(“0”.concat(line[0]).trim());
评论
int values = line[0].isEmpty() ? 0 : Integer.valueOf(line[0]);
int values = Integer.valueOf("0" + line[0]);
"0-123"