【Kotlin】総当りのロジック - AccelerometerPlay

意外と自分で考えても埒が明かないので調べてみたので。


val countries = listOf("brazil", "italy", "england", "spain", "japan")

val games = mutableListOf<String>()


val indices = countries.indices
indices.forEach { left ->
  indices.forEach { right ->
    if (left < right) {
      games.add("${countries[left]}\tvs\t${countries[right]}")
    }
  }
}

// val rights = countries.toMutableList()
// countries.forEach { left ->
//   rights.removeFirst()
//   rights.forEach { right ->
//     games.add("$left\tvs\t$right")
//   }
// }


games.forEachIndexed() { index, game ->
  println("${index + 1}. $game")
}
println("All ${games.size} games")

assertTrue(
  countries.size * (countries.size - 1) / 2 == games.size
)


1. brazil	vs	italy
2. brazil	vs	england
3. brazil	vs	spain
4. brazil	vs	japan
5. italy	vs	england
6. italy	vs	spain
7. italy	vs	japan
8. england	vs	spain
9. england	vs	japan
10. spain	vs	japan
All 10 games

総当りの表を脳内でイメージできないと、このロジックは書けないと想う。

総当り

図表をまずは描いてみること大事。

以下、移植時、ボール同士の衝突判定時に使いました。



👉 Android AccelerometerPlay Sample - Google Archive hatena-bookmark

👉 【当たり判定】円と円の当たり hatena-bookmark


Android 開発環境のいろいろな「バージョン」の 確認方法 と 関係 2022年11月

開発中に、こんなエラーでました。


The project is using an incompatible version (AGP 8.0.0-alpha05) of the Android Gradle plugin. Latest supported version is AGP 7.3.1
https://developer.android.com/studio/releases#android_gradle_plugin_and_android_studio_compatibility

良く分かっていないですが2つの「バージョン」の相性が悪いようです。

開発環境はそれぞれのバージョンを持つ複数の何かで構成されています。

これまでも整理してきましたが、

👉 【Android Studio】ビルド環境を安定した最新バージョンにする hatena-bookmark
👉 Android Studio の設定で「バージョン」の記述してるとこありすぎね? hatena-bookmark

これらを踏まえて、今現在のバージョンで再度整理してみます。

まずは、私の環境でそれぞれのバージョンを確認していきます。

 

■ Android Studio

Android Studio で、左上のメニューから、


Android Studio

  ↓

About Android Studio

Android Studio Dolphin | 2021.3.1 Patch 1


Android Studio Dolphin | 2021.3.1 Patch 1
Build #AI-213.7172.25.2113.9123335, built on September 30, 2022
Runtime version: 11.0.13+0-b1751.21-8125866 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.

Android Studio のバージョンは、


Android Studio Dolphin | 2021.3.1 Patch 1

です。

 

■ Android Gradle Plugin

同様にメニューから、


File

 ↓

Project Structure

 ↓

Project

選択肢しか表示されてない!

Android Gradle Plugin
👉 Cannot find AGP version in build files & empty Android Gradle Plugin Version - Stack Overflow hatena-bookmark

Plugin DSL の影響でしょうか。

module = "com.android.tools.build:gradle" を参照する id = "com.android.application" のバージョンを確認します。

👉 【Plugin DSL】「com.android.tools.build:gradle」の記述は不要? hatena-bookmark


# gradle/libs.versions.toml

[versions]
agp = "7.3.1"

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
# android-application = { id = "com.android.library", version.ref = "agp" }

Android Gradle plugin のバージョンは、


7.3.1

です。

最初のエラーのメッセージに従って 8.0.0-alpha05 → 7.3.1 と下げました。

👉 【Plugin DSL】Android Gradle Plugin のバージョンがわからない hatena-bookmark

 

■ Gradle

メニューから、


File

 ↓

Project Structure

 ↓

Project

Gradle version

または、ターミナルでコマンド打ちます。


❯ ./gradlew --version

------------------------------------------------------------
Gradle 7.5.1
------------------------------------------------------------

Build time:   2022-08-05 21:17:56 UTC
Revision:     d1daa0cbf1a0103000b71484e1dbfe096e095918

Kotlin:       1.6.21
Groovy:       3.0.10
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          11.0.16.1 (Homebrew 11.0.16.1+0)
OS:           Mac OS X 13.0 x86_64

または、gradle-wrapper.properties を見ます。


# gradle/wrapper/gradle-wrapper.properties

distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

Gradle のバージョンは、


7.5.1

です。

 

■ 各バージョン同士の関係

The Android Studio build system is based on Gradle, and the Android Gradle plugin adds several features that are specific to building Android apps. The following table lists which version of the Android Gradle plugin is required for each version of Android Studio.

Android StudioのビルドシステムはGradleをベースにしており、Android Gradleプラグインは、Androidアプリのビルドに特化したいくつかの機能を追加します。次の表は、Android Studioの各バージョンに必要なAndroid Gradleプラグインのバージョンを示しています。

Android Gradle plugin and Android Studio compatibility
👉 Android Gradle plugin and Android Studio compatibility - Android Studio Dolphin | 2021.3.1  |  Android Developers hatena-bookmark

Android Studio Dolphin | 2021.3.1 に、今現在、最適な Android Gradle Plugin は、安定版最新の 7.3.1 です。

The following table lists which version of Gradle is required for each version of the Android Gradle plugin. For the best performance, you should use the latest possible version of both Gradle and the plugin.

次の表は、Android Gradleプラグインの各バージョンに必要なGradleのバージョンを示しています。最高のパフォーマンスを得るためには、Gradleとプラグインの両方の可能な限り最新のバージョンを使用する必要があります。

The following table lists which version of Gradle is required for each version of the Android Gradle plugin. For the best performance, you should use the latest possible version of both Gradle and the plugin.
👉 Update Gradle - Android Gradle plugin release notes  |  Android Developers hatena-bookmark

Android Gradle Plugin7.3.1 に、最適な Gradle のバージョンは、安定版最新の 7.5.1 です。

 

■ 各リポジトリとダウンロード先

Android StudioAndroid Gradle PluginGradle それぞれの公開してるURLを並べておきます。

👉 Download Android Studio & App Tools - Android Developers hatena-bookmark
Android Studio Download

👉 Android Gradle Plugin - Google's Maven Repository hatena-bookmark
Android Gradle Plugin

👉 Gradle Distributions hatena-bookmark
Gradle Distributions

 

■ まとめ

それぞれのバージョン同士に範囲があることを考えながら、その中で安定版の最新のバージョンにするのがいいでしょう。

この先には、Kotlin Gradle Plugin "org.jetbrains.kotlin:kotlin-gradle-plugin" のバージョンなどもあったりしますが、また次の機会に書きます。

👉 【Android Studio Flamingo】dependencies をバージョンアップデートするときに確認するべき3つの相性 hatena-bookmark

👉 AndroidStudio 利用する Java (JDK) の選択・設定の方法 hatena-bookmark


【Plugin DSL】Android Gradle Plugin のバージョンを調べる方法

Google Maven Repository では公開されているバージョンは分かりますが。

【Plugin DSL】Android Gradle Plugin のバージョンはどこに記述するのか

👉 Google's Maven Repository hatena-bookmark

Plugin DSLVersion Catalogtoml を使うと、今現在安定版の Android Studio 上ではうまく表示されないようです。

Android Gradle Plugin

レガシーな記述では、build.gradle の以下の* 部分に記述されていました。


// build.gradle (root)

buildscript {
  repositories {
    gradlePluginPortal()
    google()
    mavenCentral()
  }

  dependencies {
    classpath 'com.android.tools.build:gradle:3.2.1' // *
    classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.41'
  }
}


// app/build.gradle (module)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

一方、 Plugin DSL では、Plugin Marker Artifacts を利用して解決されるので、com.android.tools.build:gradle の記述は消えます。

よくある基本的な記述を以下に挙げます。


# gradle/libs.versions.toml

[versions]
agp = "7.3.1" // *
kotlin = "1.7.20"

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" } // *
android-library = { id = "com.android.library", version.ref = "agp" } // *
android-lint = { id = "com.android.lint", version.ref = "agp" }
android-test = { id = "com.android.test", version.ref = "agp" }

kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }


// build.gradle.kts (root)

plugins {
    alias(libs.plugins.android.application) apply false
    alias(libs.plugins.android.library) apply false
    alias(libs.plugins.android.lint) apply false
    alias(libs.plugins.android.test) apply false
    alias(libs.plugins.kotlin.android) apply false
    alias(libs.plugins.kotlin.kapt) apply false
}


// app/build.gradle.kts (module)

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
}

この場合の、Android Gradle plugin のバージョンは、 [version]agp の値になりますので、7.3.1 ということになります。

詳しくは以前にに書きました。
👉 【Plugin DSL】「com.android.tools.build:gradle」の記述は不要? hatena-bookmark

 

■ まとめ

build.gradle


classpath 'com.android.tools.build:gradle:x.y.z'

の記述がない場合の Android Gradle Plugin のバージョンは、

以下の、どれかのプラグインID のバージョン(共通) です。


- com.android.application
- com.android.library
- com.android.lint
- com.android.test

👉 q=.gradle.plugin - Google's Maven Repository hatena-bookmark

👉 Jetpack Compose Samples でも使われている「Version catalog update plugin」で libs.versions.toml を書き出してみる hatena-bookmark

👉 【Plugin DSL】「com.android.tools.build:gradle」の記述は不要? hatena-bookmark