【问题标题】:return substring within an array返回数组中的子字符串
【发布时间】:2016-09-21 14:44:38
【问题描述】:

我找到了一个很好的解决方案,但并不完全适合我的问题:

String s = "abc.def.ghfj.qert"; 
s.substring(s.lastIndexOf(".") + 1)

来源: Java: Getting a substring from a string starting after a particular character

我必须在数组中使用它,但我不知道该怎么做......对不起。

我得到以下代码:

a = [];
b=getLinkedItems(item("link_M"))
for(i in 0..b.size()-1)
{ a[i] = b.getAt(i).toString().reverse().substring(0,1) }
total = 0
for(x in a) { total = total +","+x }
val = total.substring(2)

这是我的结果:

[b] = [java.util.ArrayList] [

Group:m.1:book1150:MGROUP.6/M/m.1, 

Group:m.6:book1150:MGROUP.6/M/m.6, 

Group:m.9:book1150:MGROUP.6/M/m.9]

[a] = [java.util.ArrayList] [1, 6, 9]

[total] = "0,1,6,9"

[val] = "1,6,9"

...但如果我的数组包含大于 9 的值,则不可行。

What can I do if my array is e.g.: 

[b] = [java.util.ArrayList] [

Group:m.1:book1150:MGROUP.6/M/m.1, 

Group:m.6:book1150:MGROUP.6/M/m.6, 

Group:m.9:book1150:MGROUP.6/M/m.12]

我的结果应该是:

[val] = "1,6,12"

谁能帮帮我?我必须在哪里写,例如"lastIndexOf(".")" 还是有人有更好的解决方案?

提前谢谢你。

【问题讨论】:

    标签: arrays groovy substring lastindexof


    【解决方案1】:

    您在问题中的语法令人困惑,但假设您的意思是:

    def list = [
        'Group:m.1:book1150:MGROUP.6/M/m.1', 
        'Group:m.6:book1150:MGROUP.6/M/m.6', 
        'Group:m.9:book1150:MGROUP.6/M/m.12'
    ]
    

    那么你可以这样做:

    def val = list.collect { row -> row.findAll(/\d+/)[-1] }.join(',')
    

    对于民丹集团的东西,试试:

    def val = list.collect { row -> row.toString().findAll(/\d+/)[-1] }.join(',')
    

    【讨论】:

    • 我的语法被正确复制。当我尝试您的代码时,我得到以下响应:错误:没有方法签名:bintan.form.Group.findAll() 适用于参数类型:(java.lang.String) 值:[\d+]
    • WTH 是bintan.form.Group?
    • 我猜bintan.form.Group 是他的getLinkedItems 方法返回的实际类型,因为这是您的代码中唯一使用findAll 的地方。
    • @PegasusTT77 添加了一个 toString() 调用来收集
    • @BalRog 不,它没有……你试过了吗? assert "Group:m.9:book1150:MGROUP.6/M/m.12".findAll(/\d+/)[-1] == '12'
    【解决方案2】:

    我建议改用正则表达式,也许还可以使用一些基于List 的混音来更好地衡量。可能是这样的:

    def b = getLinkedItems(item("link_M"))
    def a = b.collect { (it.toString() =~ /\d+$/)[0] }
    def val = a.join(",")
    def total = "0," + val
    

    在此,b.collectb 的每个元素运行一次Closure,返回一个List 的结果以分配给a。 find (=~) 运算符返回一个Matcher 对象,该对象在左侧的源String 中查找右侧正则表达式的所有实例(在本例中为/\d+$/)。可以通过像List 一样对其进行索引,从Matcher 中检索匹配的值。然后在下一行,a.join(",")a 的所有元素与, 作为分隔符连接在一起。

    正则表达式/\d+$/表示:

    • \d+ 任何一位或多位数字的子串
    • $ 源末尾String

    【讨论】:

    • 太棒了!这正是我所需要的。非常感谢! :-) 这是我想要的 val 结果:返回值:“1,6,12”
    • 太好了,很高兴为您提供帮助。不要急于求成,那你会选择我的答案吗?
    • 你不爱出风头,我是新手,没有完整阅读如何选择正确答案的说明...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2016-08-27
    • 2015-09-18
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多