【Golang】配列(slice)の最大値・最小値を取得する方法

手段①:素直にfor..range文でループ処理をする

配列(slice)をfor..range構文でループ処理を行い、要素を1つずつ順に比較するやり方です。

初めは先頭の要素を変数maxに代入し、前の要素より数値が大きい場合に変数maxを上書きします。

package main

import (
	"fmt"
)

func main() {
  numbers := []int{3, 4, 7, 11, 2, 8, 9, 5}

  // 最大値取得
  max := numbers[0] // 配列内にある先頭の数値を取得
  for _, number := range numbers {
    if max < number {
      max = number
    }
  }

  // 最小値取得
  min := numbers[0] // 配列内にある先頭の数値を取得
  for _, number := range numbers {
    if min < number {
      min = number
    }
  }

  fmt.Println(max) // => 11
  fmt.Println(min) // => 2
}

自作で最大値を取得するメソッドを作る場合は、以下のようにも書けます。

package main

import (
	"fmt"
)

func main() {
  numbers := []int{3, 4, 7, 11, 2, 8, 9, 5}

  max := max(numbers) // max関数呼び出し
  min := min(numbers) // min関数呼び出し

  fmt.Println(max) // => 11
  fmt.Println(min) // => 2
}

// 最大値を取得するmax関数
func max(numbers []int) int {
  max := numbers[0]
  for _, number := range numbers {
    if max < number {
      max = number
    }
  }
  return max
}

// 最小値を取得するmin関数
func min(numbers []int) int {
  min := numbers[0]
  for _, number := range numbers {
    if min > number {
      min = number
    }
  }
  return min
}

手段②:sortパッケージを使用する

sortパッケージを使用して、配列内の数値を小さい順に並べ替えます。

そしたら先頭が最小値末尾が最大値となるので、配列に対してインデックス番号を指定することでそれぞれ取得できます。

package main

import (
	"fmt"
	"sort" // sortパッケージをインポート
)

func main() {
  numbers := []int{3, 4, 7, 11, 2, 8, 9, 5}
  fmt.Println(numbers) // => [3 4 7 11 2 8 9 5] 並び替え前

  sort.Ints(sort.IntSlice(numbers)) // sortパッケージの関数によって配列内の数値がソートされる
  fmt.Println(numbers) // => [2 3 4 5 7 8 9 11] 並び替え後

  fmt.Println(numbers[len(numbers) - 1]) // => 11
  fmt.Println(numbers[0])                // => 2
}

自作の関数を作るとしたら以下のような書き方ができると思います。

package main

import (
	"fmt"
	"sort" // sortパッケージをインポート
)

func main() {
  numbers := []int{3, 4, 7, 11, 2, 8, 9, 5}

  max := max(numbers)
  min := min(numbers)

  fmt.Println(max) // => 11
  fmt.Println(min) // => 2
}

// 最大値を取得するmax関数
func max(numbers []int) int {
  sort.Ints(sort.IntSlice(numbers))
  return numbers[len(numbers) - 1]
}

// 最小値を取得するmin関数
func min(numbers []int) int {
  sort.Ints(sort.IntSlice(numbers))
  return numbers[0]
}

手段③:go-funkパッケージを使用する

go-funkというGolangのライブラリを使用すると、以下のように記述するだけで簡単に配列から最大値と最小値が取得できます。

funk.MaxInt(配列) // 最大値の取得
funk.MinInt(配列) // 最小値の取得

実際に使用するには、まずターミナルで以下のコマンドを実行し、go-funkライブラリをインストールします。

go get github.com/thoas/go-funk

後は、ソースコードでライブラリをインポートすれば使えるようになります。

package main

import (
	"fmt"
	"github.com/thoas/go-funk"
)

func main() {
  numbers := []int{3, 4, 7, 11, 2, 8, 9, 5}

  max := funk.MaxInt(numbers) // 最大値の取得
  min := funk.MinInt(numbers) // 最小値の取得

  fmt.Println(max) // => 11
  fmt.Println(min) // => 2
}

go-funkには他にも便利な関数が色々あるので、詳しく知りたい方はこちらのドキュメントをご覧ください。

タイトルとURLをコピーしました