gpt4 book ai didi

string - 有没有一种 Groovier 方法可以将破折​​号添加到字符串中?

转载 作者:行者123 更新时间:2023-12-04 05:25:27 24 4
gpt4 key购买 nike

我有以下代码,它有效,但我想知道是否有一种“groovier”的方式来做到这一点:

/**
* 10 digit - #-######-##-#
* 13 digit - ###-#-######-##-#
* */
private formatISBN(String isbn) {
if (isbn?.length() == 10) {
def part1 = isbn.substring(0, 1)
def part2 = isbn.substring(1, 7)
def part3 = isbn.substring(7, 9)
def part4 = isbn.substring(9, 10)
return "${part1}-${part2}-${part3}-${part4}"
} else if (isbn?.length() == 13) {
def part1 = isbn.substring(0, 3)
def part2 = isbn.substring(3, 4)
def part3 = isbn.substring(4, 10)
def part4 = isbn.substring(10, 12)
def part5 = isbn.substring(12, 13)
return "${part1}-${part2}-${part3}-${part4}-${part5}"
} else {
return isbn
}
}

最佳答案

您可以先使用 []字符串运算符来获取子字符串而不是 substring并删除中间变量。例如 length == 10 的情况:

"${isbn[0]}-${isbn[1..6]}-${isbn[7..8]}-${isbn[9]}"

现在,那里有一些重复。您可以先获取所有 isbn段,然后 .join他们与 '-' :
[isbn[0], isbn[1..6], isbn[7..8], isbn[9]].join('-')

而且,更进一步,而不是引用 isbn每次,您都可以列出您想要获取的范围,然后使用 collect 同时获取它们。 :
[0, 1..6, 7..8, 9].collect { isbn[it] }.join('-')

如果您要进行代码打高尔夫球,您还可以执行以下操作:
('-'+isbn)[1, 0, 2..7, 0, 8..9, 0, 10]

我会让你弄清楚它是如何工作的,但我想把它留在生产代码上可能不是一个好主意,除非你想让 future 的维护者感到惊讶,呵呵。

另外,请注意 length == 13 时的格式与 length == 10 相同但是使用不同的前缀,您可以在这种情况下重用相同的功能。整个功能(通过几个测试)将是:
/**
* 10 digit - #-######-##-#
* 13 digit - ###-#-######-##-#
**/
def formatIsbn(isbn) {
switch (isbn?.length()) {
case 10: return [0, 1..6, 7..8, 9].collect { isbn[it] }.join('-')
case 13: return isbn.take(3) + '-' + formatIsbn(isbn.drop(3))
default: return isbn
}
}

assert formatIsbn('abcdefghij') == 'a-bcdefg-hi-j'
assert formatIsbn('abcdefghijklm') == 'abc-d-efghij-kl-m'

现在,我认为该代码中有一些难闻的气味。可以 isbnnull ?至少对我来说,这看起来不像是一个需要担心其参数的无效性的函数,或者至少通过阅读它的名称并不清楚(它应该被称为 formatIsbnOrNull 而不是 ISBN 字符串和接受空值)。如果空值无效,则让它爆炸 NullPointerException访问 isbn.length() 时所以调用者知道他们传递了一个错误的参数,而不是默默地返回相同的 null。
return ISBN 也是如此。在末尾。该函数是否期望接收一个既不是 10 也不是 13 个字符长的字符串?如果没有,更好 throw new IllegalArgumentException()并让来电者知道他们打错了电话。

最后,我不确定这是否是最“可读”的解决方案。另一种可能的解决方案是为格式设置一个字符串,例如 '###-#-######-##-#'然后替换 #isbn 提供人物。我认为它可能更自我记录:
def formatIsbn(isbn) {
def format = [
10: '#-######-##-#',
13: '###-#-######-##-#'
][isbn.length()]
def n = 0
format.replaceAll(/#/) { isbn[n++] }
}

关于string - 有没有一种 Groovier 方法可以将破折​​号添加到字符串中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11354293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com