質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Go

    545questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Go言語の自前ソート関数を定義したい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 796

dboyaji

score 88

Go言語のsortについてお聞きします。
(以前、構造体のSortについてお聞きしました)

c言語のqsortのように、自前で関数を定義して柔軟に
ソートをすることは出来ませんか?

サンプルソースで教えて頂きたいです。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

以下、実行サンプルです。
独自のpersonSorterインターフェースを定義しています。
package main

import (
  "fmt"
  "sort"
)

type Person struct {
  Name string
  Age int
}

func (p Person) String() string {
  return fmt.Sprintf("%s: %d", p.Name, p.Age)
}

type By func(p1, p2 *Person) bool

func (by By) Sort(persons []Person) {
  ps := &personSorter{
    persons: persons,
    by: by,
  }
  sort.Sort(ps)
}

type personSorter struct {
  persons []Person
  by func(p1, p2 *Person) bool
}

func (s *personSorter) Len() int {
  return len(s.persons)
}

func (s *personSorter) Swap(i, j int) {
  s.persons[i], s.persons[j] = s.persons[j], s.persons[i]
}

func (s *personSorter) Less(i, j int) bool {
  return s.by(&s.persons[i], &s.persons[j])
}

//実行関数
func main() {
  people := []Person{
    {"A", 1},
    {"D", 4},
    {"B", 2},
    {"C", 3},
  }
  name := func(p1, p2 *Person) bool {
  return p1.Name < p2.Name
}

age := func(p1, p2 *Person) bool {
  return p1.Age < p2.Age
}
--結果
By(name).Sort(people)
fmt.Println(people)

By(age).Sort(people)
fmt.Println(people)
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

  • 解決済

    (PHP)1000個×1000個の数字の組み合わせを、素早く比べる方法

    PHPで、1000個の数字の配列($arr1)と別の1000個の数字の配列($arr2)を照合したいと思っています。 foreach( $arr1 as $n1 ) { fo

  • 解決済

    find sort ファイル名順

    findの結果をファイル名順にソートするにはどのように記述すればよいでしょうか? aaa/bbb/ccc/01 aaa/bbb/ccc/02 aaa/bbb/ccc/03

  • 解決済

    Java Realmでタイトルでのソートができません。

    以下のようなコードを書きました。 年月日でのソートはできるようになりましたが、タイトルでのソートができませんでした。 タイトルでのソートを実行すると、何らかのソートをしてい

  • 受付中

    Listviewの中身をソートしたい

    ボタン(R.id.sort)を押すとソートする処理を作りたいのですが どうすればいいのでしょうか package com.example.innovation.f_feat

  • 解決済

    sortメソッドについて

    現在JavaGoldの勉強をしています。 以下リンク3番の問題でsortメソッドがコンパイルエラーするため正解はEですが、 これはどういった意図の問題だと予測されるでしょうか?

  • 受付中

    CSV形式 Java

    「任意の数値がカンマ区切されたCSV形式の文字列を引数として入力すると 数値を昇順にソートし直した文字列を返却するサブルーチンを作成。 尚、CSV形式で格納される数値は64

  • 解決済

    Laravel初心者です。

    タイトルにある通りlaravel初心者です。参考書を買いその通りに進めているのですが、参考書通りにログイン画面を作り、/helloにアクセスしたところ、SQLSTATE[42S22

  • 解決済

    配列を数値順にするときに、先頭の要素が-1になってしまう

     前提・実現したいこと C言語初心者です。配列の要素の数値を順番に並び替えるプログラムを作っています。 (参考書の例題を写したものです) 並び替えたあと最初の要素が必ず-1になって

同じタグがついた質問を見る

  • Go

    545questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。