更改不带 if 语句的 String 的值

Change value of String without if statement

提问人:Grismak 提问时间:11/10/2023 最后编辑:Grismak 更新时间:11/13/2023 访问量:79

问:

我需要将 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()));

从文件上看,第一个对象之间的顺序是清空的,并且具有值是随机的,以避免预测器算法。

java 数组 字符串 性能 if-statement

评论

4赞 Jon Skeet 11/10/2023
“有没有办法避免三元运算符和 if else 语句?”——试图避免最明显的方法的目的是什么?我个人会使用条件运算符,作为简单的单行代码:.我不明白为什么你会期望或需要它比这更简单。int values = line[0].isEmpty() ? 0 : Integer.valueOf(line[0]);
3赞 President James K. Polk 11/10/2023
为什么避免它们如此重要?你在找什么?
0赞 Grismak 11/10/2023
我正在寻找性能,也在寻找基本的好奇心。文件可能很长,并且无法预测字符串是否为空,因此会导致文件的处理出现相当大的延迟。如果我必须首先检查所有重要变量是否为空,这将使程序的复杂性变得一团糟
2赞 aled 11/10/2023
@Grismak也许你听说过“过早优化是万恶之源”这句话。别这样。
1赞 3limin4t0r 11/10/2023
如果数字不能为负数,则只需在字符串前面加上“0”即可。.如果该值可以为负数,则将导致无效字符串(例如),这将引发异常。int values = Integer.valueOf("0" + line[0]);"0-123"

答:

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小心。如果数字大于或小于 ,则将创建第二种方法。因为在那之后添加意味着它不再适合NumberFormatException214748364-2147483640int
0赞 Grismak 11/13/2023
是的,如果我得到负数、null 或更大的数字可以抛出异常(文件是坏的),这个值是非常具体的,所以这是一个极端情况,但这个观点非常值得赞赏
0赞 Grismak 11/13/2023
int 值 = Integer.valueOf(“0”.concat(line[0]).trim());