使用Java流对concat字符串执行算术运算

三态

大家好,谢谢大家的帮助。

我有一个Stream<String>字符串可以像“ 1 + 5 * 2-4” // = 8的东西(如果我从左到右计算它可以)

这个操作没问题,但是我现在只尝试使用Streams,这意味着我只需要使用流操作,例如filter,reduce,collect ...

我尝试了过去6个小时,却一无所知。不允许建立列表并分析此方向的元素或其他内容。一个流操作或多个流操作必须直接给我最终结果。

有人有什么想法吗?

我最好的尝试是

  Stream<String> numbers = myList.stream().filter(s -> 
  Character.isDigit(s.charAt(0)));
  List<String> operands = myList.stream().filter(s -> 
  !Character.isDigit(s.charAt(0))).collect(Collectors.toList());



   String result = numbers.reduce((a, b) -> {
   int iA = Integer.parseInt(a);
   int iB = Integer.parseInt(b);

   String operation = operands.get(0);
   operands.remove(0);
   return calc(iA,iB,operation);


  }).get();

  System.out.println(result);

更新:我可能解释得很糟。最终结果必须提供流操作。在此流操作中,我们可以调用辅助方法。

尼古拉斯·查拉兰比迪斯

工作解决方案,修正了错别字,这要归功于@ T​​uring85

Java-8 Stream-API确实不是万能的灵丹妙药,而且我看不到任何使用lambda表达式的简单解决方案。

我建议您坚持使用程序性方法:

String string = "1+5*2-4";

String[] operator = a.split("[0-9]+");
String[] digits = a.split("[+-\\/*]");

int reduced = Integer.parseInt(digits[0]);
for (int i = 1; i < digits.length; i++) {
    if (operator[i].equals("+")) { reduced += Integer.parseInt(digits[i]); } 
    else if (operator[i].equals("/")) { reduced /= Integer.parseInt(digits[i]); } 
    else if (operator[i].equals("*")) { reduced *= Integer.parseInt(digits[i]); } 
    else if (operator[i].equals("-")) { reduced -= Integer.parseInt(digits[i]); }
}

此解决方案仅简化为整数,并且没有输入和字符检查序列。中的reduced结果8顺便说一句,不要忘记使用/两次字符进行转义\\,因为它在正则表达式中具有特殊含义。


如果您真的坚持基于Stream-API的解决方案,该解决方案给出了相同的结果,请执行以下操作:

String a = "1+5*2-4";
System.out.println(a);
String[] operator = a.split("[0-9]+");
String[] digits = a.split("[+-\\/*]");

final int[] index = {0};
int reduced = Stream.of(digits)
                    .mapToInt(Integer::parseInt)
                    .reduce(0, (int t, int u) -> 
{
    int result = Integer.parseInt(digits[0]);
    int i = index[0];
    if (operator[i].equals("+")) { result = t + u; } 
    else if (operator[i].equals("/")) { result = t / u; } 
    else if (operator[i].equals("*")) { result = t * u; } 
    else if (operator[i].equals("-")) { result = t - u; } 
    index[0]++;
    return result;
}); 

我希望现在您可以现在比较这两个结果,看看在简洁性和可维护性方面哪个胜出,在我看来,这比证明您使用Stream-API和lambda表达式的性能更重要。但是,如果您为了了解有关Stream-API的更多知识而挑战自己,建议您尝试查找其他用例。:)


编辑:此外,您应该将操作员数字处理隐藏为一种方法:

public static int process(int identity, int t, int u, String[] array, int index) {
    int result = identity;
    if (array[index].equals("+")) { result = t + u; } 
    else if (array[index].equals("/")) { result =  t / u; } 
    else if (array[index].equals("*")) { result =  t * u; } 
    else if (array[index].equals("-")) { result =  t - u; }
    return result;
}

然后,我可能会承认Stream-API并不是一个不错的选择。

String a = "1+5*2-4";
System.out.println(a);
String operator[] = a.split("[0-9]+");
String digits[] = a.split("[+-\\/*]");

final int[] index = {0};
int reduced = Stream.of(digits).mapToInt(Integer::parseInt).reduce(0, (int t, int u) -> {
    int result = process(Integer.parseInt(digits[0]), t, u, operator, index[0]);
    index[0]++;
    return result;
}); 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Java中对字符串执行算术运算?

用字符串进行算术运算的concat结果

Lua:尝试对字符串值执行算术运算

Lua错误“试图对字符串值执行算术运算”

如何使用整数和字符串作为输入执行算术运算

使用 XSLT 2.0 或 3.0 对字符串执行算术运算时出现问题

如何使用Pandas从字符串中提取算术运算

从定义为字符串的运算符执行算术运算

包含数字的字符串的算术运算

带字符串的SCSS算术运算

字符串数组的算术运算

试图对表示为字符串的数字执行算术运算

打字稿在执行算术运算时对字符串的类型发誓

尝试对全局'num1'(字符串值)执行算术运算

如何从变量中读取符号分隔的字符串,转换为数字并执行算术运算?

有没有办法对从字符串 cpp 转换而来的整数执行算术运算

使用Java的concat字符串

Concat字符串和整数流

如何在 Pyspark 中进行字符串算术运算

将字符串转换为算术运算符

使用指针算术的字符串的字谜

Excel - 根据起始字符串过滤行,从过滤的行中读取数字并执行算术运算以生成列摘要

使用awk执行算术运算

使用Java 8流的字符串数组的长度总和

使用Java流更新字符串数组

使用流(Java)获取整数形式的字符串

如何使用字符串评估减法运算-Java

如何对表示为字符串的值和运算符进行算术运算?

带有算术运算符加法运算的 Swift 字符串数组