【问题标题】:How to pass multiple delimiters to a substring (Kotlin/Android)?如何将多个分隔符传递给子字符串(Kotlin/Android)?
【发布时间】:2020-12-17 23:46:43
【问题描述】:

我正在尝试制作一个计算器应用程序,并且我需要能够在有人第二次按下运算符(+,*,-,/)后获得最后一个值(第一个值保存时没有问题,因为它是屏幕上唯一的数字)。 所以如果屏幕顶部有类似 (222 * 3333 / 12) 的东西,我需要得到 12。一旦我学会了如何做到这一点,我就可以弄清楚如何保存以前的数字/总和,然后在下一个数字(虽然我还没有制作那部分)。 我知道这是一种笨拙的做事方式,任何建议都会受到赞赏。 因此,如果我使用 substringAfterLast() 并在其中插入一个运算符,我可以获取这个数字,但是,如果混合使用多个运算符(如 222 * 3333 / 12),我的 y 变量(见下文)只会显示“222 * 3333 / 12" 而不是 12。 如何为子字符串使用多个分隔符?

这是我的代码(请见谅)

        multiplybutton.setOnClickListener {
            var x = numbersEntered.toString()
            var y = ""
            //creates an array that holds the operators so it can be easily filtered out
            val operators = arrayOf<Char>('*','/','+','-')
            //prevents app from crashing by saving the last value before the operator is added, allowing us to create infinite number of operations
            if (x.any(operators :: contains)){
//                x.split(operators.toString())
                
                y = x.substringAfterLast('*')  // can't use my operator character array here? why? how do I iterate through it?
                Toast.makeText(this, y.toString(), Toast.LENGTH_SHORT).show()

//                previousvalue = y.toInt()
            } else {
                previousvalue = x.toInt()
            }
            numbersEntered.append("*")
            numbersEnteredBox.setText(numbersEntered.toString())
            isMultiply = true;
            Toast.makeText(this, previousvalue.toString(), Toast.LENGTH_SHORT).show()
        }

编辑:请忽略斜体,不知道出了什么问题

【问题讨论】:

  • 我想一种方法是获取 +-*/ 的最后一个索引。然后,您存储具有最大值的运算符并执行substringAfterLast,或者(更容易)您只需将子字符串从该索引开始。但总的来说,这不会让你走多远(取决于你打算用你的计算器走多远)。您最终将不得不使用解析器和语法。
  • 有趣!其实我没想到。

标签: android kotlin substring


【解决方案1】:

split 与正则表达式一起使用

使用正则表达式可以让您更好地控制字符串的拆分方式。在您的情况下,任何不是数字的数字都可能是分隔符。正则表达式有一个内置的字符类,用\D 表示,它将匹配任何不是数字的字符。

val pattern = Regex("""\D+""") // matches one or more non-digit characters
"1 * 2 / 3".split(pattern).last() // returns "3"

同样,您可以使用[] 创建自己的字符类,以更具体地确定要用作分隔符的字符:

val pattern = Regex("""\s*[-\+*]\s*""") // matches -\+*, and any spaces around them
"1 * 2 / 3".split(pattern).last() // returns "3"

【讨论】:

  • 谢谢!我对使用正则表达式非常犹豫,因为我听说它需要很大的开销(尽管对于像这样小的应用程序来说这根本不是问题),而且对于像我这样的初学者来说它是多么难以理解,哈哈。很好的答案!
  • 正则表达式的性能取决于它们的复杂程度。如果您有兴趣,这里有一些很好的答案:stackoverflow.com/questions/2667015/…
  • 如果您以前没有使用过正则表达式,只是想了解更多有关如何使用它们的信息,一个很好的起点是这个答案:stackoverflow.com/a/2759417/4618331
【解决方案2】:

对不起,也许我不完全明白你想要做什么,但你可以使用split 函数从字符串中获取最后一个数字,例如222 * 3333 / 12

println("222 * 3333 / 12".split('+', '-', '*', '/').last().trim().toInt())
// prints 12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2020-01-08
    • 2018-09-02
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多