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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Go

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

Q&A

解決済

1回答

1420閲覧

golangで配列の要素をフィルターしたいです

退会済みユーザー

退会済みユーザー

総合スコア0

Go

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

0グッド

0クリップ

投稿2017/12/20 02:22

編集2017/12/20 02:34

#ヤリタイコト
golangで

src := [...]int{1, 2, 3, 4, 5} filter := [...]int{3, 5}

この二つの配列の被っている要素だけを抜き出して配列にしたいです。(数学で言うsrc ∩ filter)
一番ハイパフォーマンスな方法を教えてください

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/12/20 03:17

{1,1,2}と{1}のとき結果はどうしたいですか?{1,1} or {1}?
退会済みユーザー

退会済みユーザー

2017/12/20 03:46

重複した場合は{1}としていただきたいです
guest

回答1

0

ベストアンサー

書いてて飽きてきてしまったのでこれが最速かどうかは分かりませんが、ベンチマークコードも載せておきます。

go

1package common 2 3import ( 4 "reflect" 5 "sort" 6 "testing" 7) 8 9func makeCommon(lhs, rhs []int) []int { 10 // 出現回数 11 m := map[int]int{} 12 13 // 存在しない時だけ1にする 14 // LHS で2回発生しても1 15 for _, v := range lhs { 16 if _, ok := m[v]; !ok { 17 m[v] = 1 18 } 19 } 20 21 // 存在する時だけ2にする 22 for _, v := range rhs { 23 if _, ok := m[v]; ok { 24 m[v] = 2 25 } 26 } 27 ret := []int{} 28 for i := range m { 29 if m[i] > 1 { 30 ret = append(ret, i) 31 } 32 } 33 sort.Ints(ret) 34 return ret 35} 36 37func TestMakeCommon(t *testing.T) { 38 tests := []struct { 39 lhs []int 40 rhs []int 41 want []int 42 }{ 43 {lhs: []int{1, 2, 3, 4, 5}, rhs: []int{3, 5}, want: []int{3, 5}}, 44 {lhs: []int{1, 2, 2, 3, 4, 5}, rhs: []int{3, 5}, want: []int{3, 5}}, 45 {lhs: []int{1, 2, 3, 3, 4, 5}, rhs: []int{3, 5}, want: []int{3, 5}}, 46 {lhs: []int{1, 1, 1}, rhs: []int{1, 1}, want: []int{1}}, 47 {lhs: []int{1, 2, 4, 5}, rhs: []int{3, 5}, want: []int{5}}, 48 {lhs: []int{1, 2, 4}, rhs: []int{3, 5}, want: []int{}}, 49 {lhs: []int{}, rhs: []int{3, 5}, want: []int{}}, 50 {lhs: []int{1, 2}, rhs: []int{}, want: []int{}}, 51 {lhs: []int{}, rhs: []int{}, want: []int{}}, 52 } 53 54 for _, tt := range tests { 55 got := makeCommon(tt.lhs, tt.rhs) 56 if !reflect.DeepEqual(got, tt.want) { 57 t.Fatalf("want %v but got %v", tt.want, got) 58 } 59 } 60} 61 62func BenchmarkMakeCommon(b *testing.B) { 63 lhs := make([]int, b.N) 64 rhs := make([]int, b.N/2) 65 for i := 0; i < b.N; i++ { 66 lhs[i] = i * 2 67 } 68 for i := 0; i < b.N/2; i++ { 69 rhs[i] = i * 3 70 } 71 b.ResetTimer() 72 makeCommon(lhs, rhs) 73}

common_test.go などに保存して

shell

1$ go test -bench . 2goos: windows 3goarch: amd64 4BenchmarkMakeCommon-4 5000000 396 ns/op 5PASS 6ok _/C_/dev/go-sandbox/dup 2.482s

で実行して下さい。

投稿2017/12/20 09:10

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問