1

ユーザー出力用の文字列のリストに参加したいと思います。各文字列間のセパレーター','は、セパレーターが である最後の要素を除いて、a でなければなりません'and'

例えば:

def a = ['one', 'two', 'three'];
println a.joinWithDifferentLast(', ', ' and ');
// output: one, two and three

Groovy でそのような結合関数を実装するにはどうすればよいですか? 1 つの要素 (セパレーターなし)、2 つの要素 (最後のセパレーター)、および複数の要素のケースを処理できると便利です。

4

3 に答える 3

4

次のようなこともできます。

def joinWithDifferentLast( List list, String others, String last ) {
  def start = list.take( list.size() - 1 ).join( others )
  def end   = list.drop( list.size() - 1 )[ 0 ]
  if( start ) {
    [ start, last, end ].join()
  }
  else {
    end as String ?: ''
  }
}

assert ''           == joinWithDifferentLast( [],          ', ', ' and ' )
assert '1'          == joinWithDifferentLast( [ 1 ],       ', ', ' and ' )
assert '1 and 2'    == joinWithDifferentLast( [ 1, 2 ],    ', ', ' and ' )
assert '1, 2 and 3' == joinWithDifferentLast( [ 1, 2, 3 ], ', ', ' and ' )
于 2013-02-15T11:25:26.767 に答える
2

楽しみのために、私は何かを少し読みやすくしようとしました:

def static joinWithDifferentLast(List list, String firstJoin, String lastJoin) {
    switch (list?.size() ?: 0) {
        case 0:
            return ''
        case 1:
            return list.head() as String
        default:
            return list.init().join(firstJoin) + lastJoin + list.last()
    }
}
于 2016-04-29T20:32:30.967 に答える
0
List.metaClass.joinWithDifferentLast { a, b ->
    delegate.join(a).reverse().replaceFirst(a.reverse(),b.reverse()).reverse()
}

def a = ['one', 'two', 'three'];
println a.joinWithDifferentLast(',',' and ') //prints one,two and three

assert ''           == [].joinWithDifferentLast(' , ', ' and ' )
assert '1'          == [ 1 ].joinWithDifferentLast( ', ', ' and ' )
assert '1 and 2'    == [ 1, 2 ].joinWithDifferentLast( ', ', ' and ' )
assert '1, 2 and 3' == [ 1, 2, 3 ].joinWithDifferentLast(', ', ' and ' ) 
assert '1 %ac 2 %ac 3 %ac 4 %ac 5 %bi 6' == [ 1, 2, 3, 4, 5, 6 ].joinWithDifferentLast(' %ac ', ' %bi ' )

私の最初のブルートフォースで素朴な(ただし修正された)推測になります:-D

List.metaClass.joinWithDifferentLast { a, b ->
    def l = delegate.size() 
    delegate[0..l-2].join(a) + b + delegate[l-1]
}

「反転」は少し少ないですが、リストの size() に関するセキュリティ化が必要です

于 2013-02-15T11:14:28.933 に答える