Groovy _ условно, если инструкции else, использующие операторы для сравнения десятичных значений [duplicate]

вы можете использовать встроенную функцию list ():

newlist=list(oldlist)

Я думаю, этот код вам поможет.

8
задан Daniel Serodio 26 August 2014 в 22:11
поделиться

9 ответов

Похоже, что это работает

String mostRecentVersion(List versions) {
  def sorted = versions.sort(false) { a, b -> 

    List verA = a.tokenize('.')
    List verB = b.tokenize('.')

    def commonIndices = Math.min(verA.size(), verB.size())

    for (int i = 0; i < commonIndices; ++i) {
      def numA = verA[i].toInteger()
      def numB = verB[i].toInteger()
      println "comparing $numA and $numB"

      if (numA != numB) {
        return numA <=> numB
      }
    }

    // If we got this far then all the common indices are identical, so whichever version is longer must be more recent
    verA.size() <=> verB.size()
  }

  println "sorted versions: $sorted"
  sorted[-1]
}

. Это неадекватный набор тестов. Вы должны добавить еще несколько.

assert mostRecentVersion(['02.2.02.01', '02.2.02.02', '02.2.03.01']) == '02.2.03.01' 
assert mostRecentVersion(['4', '2']) == '4'
assert mostRecentVersion(['4.1', '4']) == '4.1'
assert mostRecentVersion(['4.1', '5']) == '5'

Запустите этот код и тесты в консоли Groovy, чтобы убедиться, что он работает

8
ответ дан Dónal 20 August 2018 в 14:56
поделиться
  • 1
    +1 Следует отметить, что метод mostRecentVersion оставит параметр versions отсортированным после его выполнения (поскольку List.sort изменяет список по умолчанию). Если это не нужно, вы можете (в groovy 1.8.1+) позвонить: def sorted = versions.sort(false) { a, b -> – tim_yates 11 October 2011 в 11:29
  • 2
    @tim_yates Не могли бы вы просто позволить мне наслаждаться моментом триумфа? О нет, тебе нужно было поддразнивать. Я неохотно обновил свой ответ, включив ваше предложение, спасибо :) – Dónal 11 October 2011 в 11:50
  • 3
    Хахаха ... извини ;-) перетасовывается обратно на стол – tim_yates 11 October 2011 в 11:59
  • 4
    Хороший ответ! Вы можете использовать метод max(Comparable) в коллекции, если вы предпочитаете сохранить исходный список немодифицированным (и сделать сложность метода линейной;) ... не то, что это действительно имеет значение в этом случае, я бы предположил, хе-хе) – epidemian 12 October 2011 в 02:28
String maxVersion(versions) {
    versions.max { a, b ->
        List verA = a.tokenize('.')
        List verB = b.tokenize('.')
        def commonIndices = Math.min(verA.size(), verB.size())
        for (int i = 0; i < commonIndices; ++i) {
            def numA = verA[i].toInteger()
            def numB = verB[i].toInteger()
            if (numA != numB) {
                return numA <=> numB
            }
        }
        verA.size() <=> verB.size()
    }
}
2
ответ дан Aleksei 20 August 2018 в 14:56
поделиться

Код, который я использую с Jenkins ExtendedChoiceParameter (толерантен к нецеловым фрагментам в строке версии)

def vers = ['none']
new File(this.getBinding().getVariable('dir')).eachDir() { dir -> dirs.add(dir.getName()) }

vers.sort{x, y ->
  def xa = x.tokenize('._-'); def ya = y.tokenize('._-')
  def sz = Math.min(xa.size(), ya.size())
  for (int i = 0; i < sz; ++i) {
    def xs = xa[i]; def ys = ya[i];
    if (xs.isInteger() && ys.isInteger()) {
      def xn = xs.toInteger()
      def yn = ys.toInteger()
      if (xn != yn) { return xn <=> yn }
    } else if (xs != ys) {
      return xs <=> ys
    }
  }

  return xa.size() <=> ya.size()
}.reverse().join(',')
0
ответ дан bobah 20 August 2018 в 14:56
поделиться

Если кто-то использует Grails (например, Grails 2.2.3), я думаю, что VersionComparator уже предоставляет именно то, что нам нужно.

Если вы не используете Grails, вы всегда можете использовать исходный код этого класса Google ,

Пример рабочих тестов:

import org.codehaus.groovy.grails.plugins.VersionComparator

assert ['1.13.4', '1.4.5'].sort( new VersionComparator() ) == ['1.4.5', '1.13.4']
assert ['3.1.20', '3', '3.0.1', '3.1'].sort( new VersionComparator() ) == ['3', '3.0.1', '3.1', '3.1.20']
assert ['02.2.02.02', '02.2.03.01', '02.2.02.01'].sort( new VersionComparator() ) == ['02.2.02.01', '02.2.02.02', '02.2.03.01']
assert ['4', '2'].sort( new VersionComparator() ) == ['2', '4']
assert ['4.1', '4'].sort( new VersionComparator() ) == ['4', '4.1']
assert ['4.1', '5'].sort( new VersionComparator() ) == ['4.1', '5']

assert new VersionComparator().compare( '1.13.4', '1.4.5' ) > 0
assert new VersionComparator().compare( '1.4.5', '1.13.4' ) < 0

Надеюсь, это поможет.

4
ответ дан Max 20 August 2018 в 14:56
поделиться
  • 1
    Спасибо, песочница Jenkins медленно превратит меня в сумасшедшего ... – mfeineis 20 December 2017 в 09:58

Шахта самая короткая! lol)

versions = versions.sort {a, b ->
  def a1 = a.tokenize('.')*.toInteger(), b1 = b.tokenize('.')*.toInteger()
  for (i in 0..<[a1.size(), b1.size()].min()) 
    if (a1[i] != b1[i]) return a1[i] <=> b1[i]
  0
}
2
ответ дан Nikita Volkov 20 August 2018 в 14:56
поделиться

Я использую gradle 4.1 в Android Studio 3.0 Beta 7. Существует версия VersionNumber.java (в разделе C: \ Users \ ssfang.gradle \ wrapper \ dists \ gradle-4.1-all \ bzyivzo6n839fup2jbap0tjew \ gradle-4.1 \ src \ core \ org \ gradle \ util)

Например:

apply plugin: 'com.android.application'

try{ // undocumented
    println "${android.plugin.getSdkFolder().getAbsolutePath()}"
    // Since 1.3.1 or 1.5.0? android studio version or android gradle plugin?
    println "${android.getSdkDirectory().getAbsolutePath()}"
}catch (ignored){
}

// As of android gradle plugin v2.1.2
println android.sdkDirectory.path
println android.ndkDirectory.path
def buildToolsVer = new File(android.sdkDirectory.path, 'build-tools').listFiles().collect{ VersionNumber.parse(it.getName()) }.sort()
println buildToolsVer
printf('%s, %s\n',  buildToolsVer.head(), buildToolsVer.last().toString())

def String mostRecentVersion(List<String> versions) {
//   TreeMap<VersionNumber, String> verNum2StrMap = versions.collectEntries(new TreeMap(), { [VersionNumber.parse(it), it] })

//    TreeMap<VersionNumber, String> verNum2StrMap = versions.inject(new TreeMap()) { memo, entry ->
//        memo[VersionNumber.parse(entry)] = entry
//        memo
//    }

    TreeMap<VersionNumber, String> verNum2StrMap = versions.inject(new TreeMap()) { map, verStr ->
        map << [(VersionNumber.parse(verStr)): verStr]
    }

    // println verNum2StrMap.lastEntry().value
    verNum2StrMap.lastEntry().value
}

assert mostRecentVersion(['02.2.02.01', '02.2.02.02', '02.2.03.01']) == '02.2.03.01'
assert mostRecentVersion(['4', '2']) == '4'
assert mostRecentVersion(['4.1', '4']) == '4.1'
assert mostRecentVersion(['4.1', '5']) == '5'

android {
    compileSdkVersion 25
    buildToolsVersion "26.0.2"
    defaultConfig {
        applicationId "ss.xsigner"
        minSdkVersion 14
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        setProperty("archivesBaseName", "xsigner")
    }
}

-

0
ответ дан samm 20 August 2018 в 14:56
поделиться

Вот модификация ответа Тима, которая берет две строки версии и возвращает логическое значение (true, если первое является более новым, чем второе)

String v1 = '02.2.01.02'
String v2 = '02.2.06.02'

boolean isMoreRecent( String a, String b ) {
    [a,b]*.tokenize('.')*.collect { it as int }.with { u, v ->
       Integer result = [u,v].transpose().findResult{ x,y -> x <=> y ?: null } ?: u.size() <=> v.size()
       return (result == 1)
    } 
}

assert !isMoreRecent(v1,v2)
assert isMoreRecent(v2,v1)​
0
ответ дан solvingJ 20 August 2018 в 14:56
поделиться

Если мы идем для кратчайшего ответа, это должно подойти близко; -)

String mostRecentVersion( List versions ) {
  versions.sort( false ) { a, b ->
    [a,b]*.tokenize('.')*.collect { it as int }.with { u, v ->
      [u,v].transpose().findResult{ x,y-> x<=>y ?: null } ?: u.size() <=> v.size()
    }
  }[-1]
}
7
ответ дан tim_yates 20 August 2018 в 14:56
поделиться
  • 1
    +1, потому что не так много людей, которые с гордостью объявят о своей короткой судьбе на открытом форуме. Повезло тебе. – Dónal 12 October 2011 в 16:10
0
ответ дан solvingJ 31 October 2018 в 11:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: