github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/common/array.go (about)

     1  package common
     2  
     3  import (
     4  	"math/rand"
     5  	"time"
     6  )
     7  
     8  func init() {
     9  	rand.Seed(time.Now().UnixNano())
    10  }
    11  
    12  func Shuffle(a []int) []int {
    13  	n := len(a)
    14  	if n == 0 {
    15  		return a
    16  	}
    17  	b := make([]int, n)
    18  
    19  	m := rand.Perm(n)
    20  	for i := 0; i < n; i++ {
    21  		b[i] = a[m[i]]
    22  	}
    23  	return b
    24  }
    25  
    26  func Index(a []int, sep int) int {
    27  	n := len(a)
    28  	for i := 0; i < n; i++ {
    29  		if a[i] == sep {
    30  			return i
    31  		}
    32  	}
    33  	return -1
    34  }
    35  
    36  // 判断 value 是否在 array 中
    37  func InArray(a []int, sep int) bool {
    38  	for _, v := range a {
    39  		if sep == v {
    40  			return true
    41  		}
    42  	}
    43  	return false
    44  }
    45  
    46  // 从 array 中移除最开始出现的 sep
    47  func RemoveOnce(a []int, sep int) []int {
    48  	i := Index(a, sep)
    49  	if i == -1 {
    50  		return a
    51  	}
    52  	b := make([]int, 0)
    53  	if i == 0 {
    54  		b = append(b, a[1:]...)
    55  	} else if i == len(a)-1 {
    56  		b = append(b, a[:i]...)
    57  	} else {
    58  		b = append(b, a[:i]...)
    59  		b = append(b, a[i+1:]...)
    60  	}
    61  	return b
    62  }
    63  
    64  // 从 array 中移除所有的 sep
    65  func RemoveAll(a []int, sep int) []int {
    66  	b := make([]int, 0)
    67  	for _, v := range a {
    68  		if v != sep {
    69  			b = append(b, v)
    70  		}
    71  	}
    72  	return b
    73  }
    74  
    75  func Remove(a []int, sub []int) []int {
    76  	b := append([]int{}, a...)
    77  	for _, v := range sub {
    78  		b = RemoveOnce(b, v)
    79  	}
    80  	return b
    81  }
    82  
    83  func ReplaceAll(a []int, old, new int) []int {
    84  	if old == new {
    85  		return a
    86  	}
    87  	if InArray(a, old) {
    88  		b := make([]int, 0)
    89  		for _, v := range a {
    90  			if old == v {
    91  				b = append(b, new)
    92  			} else {
    93  				b = append(b, v)
    94  			}
    95  		}
    96  		return b
    97  	}
    98  	return a
    99  }
   100  
   101  func Deduplicate(a []int) []int {
   102  	n := len(a)
   103  	if n == 0 {
   104  		return a
   105  	}
   106  	m := make(map[int]bool)
   107  
   108  	b := []int{a[0]}
   109  	m[a[0]] = true
   110  	for i := 1; i < n; i++ {
   111  		if !m[a[i]] {
   112  			b = append(b, a[i])
   113  			m[a[i]] = true
   114  		}
   115  	}
   116  	return b
   117  }
   118  
   119  // 比较两个数组的元素是否相等
   120  func Equal(x, y []int) bool {
   121  	if len(x) == len(y) {
   122  		return Contain(x, y)
   123  	}
   124  	return false
   125  }
   126  
   127  func Contain(x, y []int) bool {
   128  	if len(x) < len(y) {
   129  		return false
   130  	}
   131  	temp := Deduplicate(y)
   132  	for _, v := range temp {
   133  		if Count(x, v) < Count(y, v) {
   134  			return false
   135  		}
   136  	}
   137  	return true
   138  }
   139  
   140  func Count(a []int, sep int) int {
   141  	count := 0
   142  	for _, v := range a {
   143  		if sep == v {
   144  			count++
   145  		}
   146  	}
   147  	return count
   148  }