471 lines
8.5 KiB
Go
471 lines
8.5 KiB
Go
package common
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"sort"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func CopySliceInt32(s []int32) []int32 {
|
|
n := len(s)
|
|
if n != 0 {
|
|
temp := make([]int32, n, n)
|
|
copy(temp, s)
|
|
return temp
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func CopySliceInt64(s []int64) []int64 {
|
|
n := len(s)
|
|
if n != 0 {
|
|
temp := make([]int64, n, n)
|
|
copy(temp, s)
|
|
return temp
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func CopySliceIntToInt32(s []int) []int32 {
|
|
n := len(s)
|
|
if n != 0 {
|
|
temp := make([]int32, n, n)
|
|
for i := 0; i < n; i++ {
|
|
temp[i] = int32(s[i])
|
|
}
|
|
return temp
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func CopySliceInt32ToInt(s []int32) []int {
|
|
n := len(s)
|
|
if n != 0 {
|
|
temp := make([]int, n, n)
|
|
for i := 0; i < n; i++ {
|
|
temp[i] = int(s[i])
|
|
}
|
|
return temp
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func CopySliceInt32ToInt64(s []int32) []int64 {
|
|
n := len(s)
|
|
if n != 0 {
|
|
temp := make([]int64, n, n)
|
|
for i := 0; i < n; i++ {
|
|
temp[i] = int64(s[i])
|
|
}
|
|
return temp
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func InSliceInt32(sl []int32, v int32) bool {
|
|
for _, vv := range sl {
|
|
if vv == v {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func InSliceInt32Slice(sl []int32, sub []int32) bool {
|
|
for _, vv := range sub {
|
|
if !InSliceInt32(sl, vv) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func DelSliceInt32(sl []int32, v int32) []int32 {
|
|
index := -1
|
|
for key, value := range sl {
|
|
if value == v {
|
|
index = key
|
|
break
|
|
}
|
|
}
|
|
if index != -1 {
|
|
sl = append(sl[:index], sl[index+1:]...)
|
|
}
|
|
return sl
|
|
}
|
|
func DelSliceInt64(sl []int64, v int64) []int64 {
|
|
index := -1
|
|
for key, value := range sl {
|
|
if value == v {
|
|
index = key
|
|
}
|
|
}
|
|
if index != -1 {
|
|
sl = append(sl[:index], sl[index+1:]...)
|
|
}
|
|
return sl
|
|
}
|
|
func DelSliceInt64s(cards []int64, sl []int64) []int64 {
|
|
c := make([]int64, len(cards))
|
|
s := make([]int64, len(sl))
|
|
copy(c, cards)
|
|
copy(s, sl)
|
|
for i := 0; i < len(sl); i++ {
|
|
for k, v := range c {
|
|
isF := false
|
|
for m, n := range s {
|
|
if v == n {
|
|
c = append(c[:k], c[k+1:]...)
|
|
s = append(s[:m], s[m+1:]...)
|
|
isF = true
|
|
break
|
|
}
|
|
}
|
|
if isF {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return c
|
|
}
|
|
|
|
// Data. Predict: ["4"]
|
|
// a := []string{"1","2","3","4"}
|
|
// b := []string{"0","1","2","3"}
|
|
func GetASliceInt32NotInB(a []int32, b []int32) []int32 {
|
|
var c []int32
|
|
temp := map[int32]struct{}{}
|
|
for _, val := range b {
|
|
if _, ok := temp[val]; !ok {
|
|
temp[val] = struct{}{} // 空struct 不占内存空间
|
|
}
|
|
}
|
|
|
|
for _, val := range a {
|
|
if _, ok := temp[val]; !ok {
|
|
c = append(c, val)
|
|
}
|
|
}
|
|
|
|
return c
|
|
}
|
|
|
|
func DelSliceIn32s(cards []int32, sl []int32) []int32 {
|
|
c := make([]int32, len(cards))
|
|
s := make([]int32, len(sl))
|
|
copy(c, cards)
|
|
copy(s, sl)
|
|
for i := 0; i < len(sl); i++ {
|
|
for k, v := range c {
|
|
isF := false
|
|
for m, n := range s {
|
|
if v == n {
|
|
c = append(c[:k], c[k+1:]...)
|
|
s = append(s[:m], s[m+1:]...)
|
|
isF = true
|
|
break
|
|
}
|
|
}
|
|
if isF {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return c
|
|
}
|
|
func DelSliceInt(sl []int, v int) []int {
|
|
index := -1
|
|
for key, value := range sl {
|
|
if value == v {
|
|
index = key
|
|
break
|
|
}
|
|
}
|
|
if index != -1 {
|
|
sl = append(sl[:index], sl[index+1:]...)
|
|
}
|
|
return sl
|
|
}
|
|
|
|
func DelSliceString(sl []string, v string) ([]string, bool) {
|
|
index := -1
|
|
for key, value := range sl {
|
|
if value == v {
|
|
index = key
|
|
break
|
|
}
|
|
}
|
|
if index != -1 {
|
|
sl = append(sl[:index], sl[index+1:]...)
|
|
}
|
|
return sl, index != -1
|
|
}
|
|
|
|
func InSliceInt32Index(sl []int32, v int32) int {
|
|
for idx, vv := range sl {
|
|
if vv == v {
|
|
return idx
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
func InSliceInt64Index(sl []int64, v int64) int {
|
|
for idx, vv := range sl {
|
|
if vv == v {
|
|
return idx
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
func IntSliceEqual(left []int, right []int) bool {
|
|
if len(left) != len(right) {
|
|
return false
|
|
}
|
|
for i := 0; i < len(left); i++ {
|
|
if left[i] != right[i] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
func Int32SliceEqual(left []int32, right []int32) bool {
|
|
if len(left) != len(right) {
|
|
return false
|
|
}
|
|
for i := 0; i < len(left); i++ {
|
|
if left[i] != right[i] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func InSliceInt64(sl []int64, v int64) bool {
|
|
for _, vv := range sl {
|
|
if vv == v {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func InSliceInt(sl []int, v int) bool {
|
|
for _, vv := range sl {
|
|
if vv == v {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func InSliceString(sl []string, v string) bool {
|
|
for _, vv := range sl {
|
|
if vv == v {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func InSliceInterface(sl []interface{}, v interface{}) bool {
|
|
for _, vv := range sl {
|
|
if vv == v {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func InsertValueToSlice(index int, value int, arr []int) []int {
|
|
arr[index] = value
|
|
playerRandData := arr[index]
|
|
arr = append(arr[:index], arr[index+1:]...)
|
|
var coinRandDataSort = make([]int, 0, len(arr))
|
|
isEnd := true
|
|
for i := 0; i < len(arr); i++ {
|
|
if arr[i] < playerRandData {
|
|
coinRandDataSort = append(coinRandDataSort, arr[:i]...)
|
|
coinRandDataSort = append(coinRandDataSort, playerRandData)
|
|
coinRandDataSort = append(coinRandDataSort, arr[i:]...)
|
|
isEnd = false
|
|
break
|
|
}
|
|
}
|
|
if isEnd {
|
|
coinRandDataSort = append(arr, playerRandData)
|
|
}
|
|
return coinRandDataSort
|
|
}
|
|
func IsLadderSlice(sl []int) bool {
|
|
sort.Ints(sl)
|
|
switch len(sl) {
|
|
case 0:
|
|
return false
|
|
case 1:
|
|
return true
|
|
default:
|
|
for i := 0; i < len(sl)-1; i++ {
|
|
if sl[i] < sl[i+1] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
|
|
func IsSameSliceStr(dst []string, src []string) bool {
|
|
if len(dst) != len(src) {
|
|
return false
|
|
}
|
|
for i := 0; i < len(dst); i++ {
|
|
if dst[i] != src[i] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
func StrSliceInt(str string, sep string) ([]int, error) {
|
|
var err error
|
|
t := strings.Split(str, sep)
|
|
var ret []int
|
|
for i := 0; i < len(t); i++ {
|
|
if n, ok := strconv.Atoi(t[i]); ok == nil {
|
|
ret = append(ret, n)
|
|
} else {
|
|
ret = append(ret, 0)
|
|
err = ok
|
|
}
|
|
}
|
|
return ret, err
|
|
}
|
|
|
|
func SliceIntEqual(dst []int, src []int) bool {
|
|
if len(dst) != len(src) {
|
|
return false
|
|
}
|
|
for i := 0; i < len(dst); i++ {
|
|
if dst[i] != src[i] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
func SliceInt64Equal(dst []int64, src []int64) bool {
|
|
if len(dst) != len(src) {
|
|
return false
|
|
}
|
|
for i := 0; i < len(dst); i++ {
|
|
if dst[i] != src[i] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
func SliceInt32Equal(dst []int32, src []int32) bool {
|
|
if len(dst) != len(src) {
|
|
return false
|
|
}
|
|
for i := 0; i < len(dst); i++ {
|
|
if dst[i] != src[i] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
func SliceNoRepeate(data []int) []int {
|
|
var newData []int
|
|
for _, value := range data {
|
|
repeate := false
|
|
for _, n := range newData {
|
|
if n == value {
|
|
repeate = true
|
|
}
|
|
}
|
|
if !repeate {
|
|
newData = append(newData, value)
|
|
}
|
|
}
|
|
return newData
|
|
}
|
|
|
|
func SliceInterfaceToInt32(data []interface{}) []int32 {
|
|
cnt := len(data)
|
|
if cnt > 0 {
|
|
val := make([]int32, 0, cnt)
|
|
for _, f := range data {
|
|
val = append(val, int32(int32(f.(float64))))
|
|
}
|
|
return val
|
|
}
|
|
return nil
|
|
}
|
|
func SliceMaxValue(sl []int) int {
|
|
maxValue := math.MinInt32
|
|
for _, value := range sl {
|
|
if value > maxValue {
|
|
maxValue = value
|
|
}
|
|
}
|
|
return maxValue
|
|
}
|
|
func SliceMinValue(sl []int) int {
|
|
minValue := math.MaxInt32
|
|
for _, value := range sl {
|
|
if value < minValue {
|
|
minValue = value
|
|
}
|
|
}
|
|
return minValue
|
|
}
|
|
func SliceValueCount(sl []int, value int) int {
|
|
var count int
|
|
for _, v := range sl {
|
|
if v == value {
|
|
count++
|
|
}
|
|
}
|
|
return count
|
|
}
|
|
func SliceValueWeight(sl []int, index int) float64 {
|
|
if index < 0 || index > len(sl) {
|
|
return 0
|
|
}
|
|
value := sl[index]
|
|
totle := 0
|
|
for _, v := range sl {
|
|
totle += v
|
|
}
|
|
return float64(value) / float64(totle)
|
|
}
|
|
|
|
type Int32Slice []int32
|
|
|
|
func (p Int32Slice) Len() int { return len(p) }
|
|
func (p Int32Slice) Less(i, j int) bool { return p[i] < p[j] }
|
|
func (p Int32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
func (p Int32Slice) Sort() { sort.Sort(p) }
|
|
|
|
type Int64Slice []int64
|
|
|
|
func (p Int64Slice) Len() int { return len(p) }
|
|
func (p Int64Slice) Less(i, j int) bool { return p[i] < p[j] }
|
|
func (p Int64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
func (p Int64Slice) Sort() { sort.Sort(p) }
|
|
|
|
type Float64Slice []float64
|
|
|
|
func (p Float64Slice) Len() int { return len(p) }
|
|
func (p Float64Slice) Less(i, j int) bool { return p[i] < p[j] }
|
|
func (p Float64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
func (p Float64Slice) Sort() { sort.Sort(p) }
|
|
|
|
func Int32SliceToString(a []int32, delim string) string {
|
|
return strings.Trim(strings.Join(strings.Fields(fmt.Sprint(a)), delim), "[]")
|
|
}
|
|
|
|
func StringSliceToString(a []string, delim string) string {
|
|
return strings.Trim(strings.Join(strings.Fields(fmt.Sprint(a)), delim), "[]")
|
|
}
|