1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ちょっとおもしろい重複チェック

Posted at

重複してるアイテムを抽出できる。位置とか取れないし、可読性悪いし、実用性低いけど。

package main

import (
	"fmt"
)

func main() {
	list := []string{
		"foo",
		"bar",
		"baz",
		"foo",
		"bar",
	}
	dups := map[string]bool{}
	for _, item := range list {
		_, dups[item] = dups[item]
	}
	fmt.Printf("%+v", dups)    // map[foo:true bar:true baz:false]
}

キモは

_, dups[item] = dups[item]

の一行で、mapのキー存在チェックが2つ目のリターンで取得できることに依ってる。

  1. dupsitem がキーとして存在しない
  2. dups[item]false, false が返る
  3. _, dups[item] = false, false となるため itemdups のキーに入る。値は false
  4. もう一度同じ値の item で処理すると、 dups[item]false, true が返る
  5. _, dups[item] = false, true となるため、 dups[item]true になる

Twitterでつぶやくだけつぶやいてたんだけど、「なんか重複チェックについてすげーひらめき昔しなかったけ」となって、
無駄に期待する羽目になった(そしてやっぱり役に立たずがっかりした)のでQiitaにも転載しとく。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?