289 lines
4.8 KiB
Go
289 lines
4.8 KiB
Go
package GoUtil
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func IntToInt32(d []int) []int32 {
|
|
r := make([]int32, 0, len(d))
|
|
for _, d := range d {
|
|
r = append(r, int32(d))
|
|
}
|
|
return r
|
|
}
|
|
|
|
func Int32ToInt(d []int32) []int {
|
|
r := make([]int, 0, len(d))
|
|
for _, d := range d {
|
|
r = append(r, int(d))
|
|
}
|
|
return r
|
|
}
|
|
|
|
func StringToInt(d []string) []int {
|
|
r := make([]int, 0, len(d))
|
|
for _, d := range d {
|
|
n, _ := strconv.Atoi(d)
|
|
r = append(r, n)
|
|
}
|
|
return r
|
|
}
|
|
|
|
func RandPopSlice(slice []int) ([]int, int) {
|
|
slen := len(slice)
|
|
if slen == 0 {
|
|
return slice, -1
|
|
}
|
|
Id := GetRand().Intn(slen)
|
|
Val := slice[Id]
|
|
Slice2 := append(slice[0:Id], slice[Id+1:]...)
|
|
return Slice2, Val
|
|
}
|
|
|
|
func RandSlice(slice []int) int {
|
|
slen := len(slice)
|
|
if slen == 0 {
|
|
return 0
|
|
}
|
|
Id := GetRand().Intn(slen)
|
|
return slice[Id]
|
|
}
|
|
|
|
func RandSliceNum(s []int, num int) []int {
|
|
slice := make([]int, len(s))
|
|
copy(slice, s)
|
|
r := make([]int, 0, num)
|
|
if num <= 0 || len(slice) < num {
|
|
return slice
|
|
}
|
|
|
|
for i := 0; i < num; i++ {
|
|
Id := GetRand().Intn(len(slice))
|
|
r = append(r, slice[Id])
|
|
slice = append(slice[0:Id], slice[Id+1:]...)
|
|
}
|
|
return r
|
|
}
|
|
|
|
func RandSliceNum2(s []interface{}, num int) []interface{} {
|
|
slice := make([]interface{}, len(s))
|
|
copy(slice, s)
|
|
r := make([]interface{}, 0, num)
|
|
if num <= 0 || len(slice) < num {
|
|
return slice
|
|
}
|
|
|
|
for i := 0; i < num; i++ {
|
|
Id := GetRand().Intn(len(slice))
|
|
r = append(r, slice[Id])
|
|
slice = append(slice[0:Id], slice[Id+1:]...)
|
|
}
|
|
return r
|
|
}
|
|
|
|
func RandSliceNumNonAdjacent(s []int, num int) []int {
|
|
slice := make([]int, len(s))
|
|
copy(slice, s)
|
|
if len(slice) < 2*num {
|
|
return nil
|
|
}
|
|
sort.Ints(slice)
|
|
result := make([]int, 0, num)
|
|
for len(result) < num {
|
|
Id := GetRand().Intn(len(slice))
|
|
result = append(result, slice[Id])
|
|
slice = SubAdjacentElemSlice(slice, Id)
|
|
}
|
|
return result
|
|
}
|
|
|
|
func SubAdjacentElemSlice(s []int, Id int) []int {
|
|
r := make([]int, 0, len(s))
|
|
for k, v := range s {
|
|
if k < Id-1 || k > Id+1 {
|
|
r = append(r, v)
|
|
}
|
|
}
|
|
return r
|
|
}
|
|
|
|
func RandStringSlice(slice []string) string {
|
|
slen := len(slice)
|
|
if slen == 0 {
|
|
return ""
|
|
}
|
|
Id := GetRand().Intn(slen)
|
|
return slice[Id]
|
|
}
|
|
|
|
func SliceStringToInt(s []string) []int {
|
|
if len(s) == 0 {
|
|
return []int{}
|
|
}
|
|
r := make([]int, 0, len(s))
|
|
for _, v := range s {
|
|
v = strings.Trim(v, " ")
|
|
v1, _ := strconv.Atoi(v)
|
|
r = append(r, v1)
|
|
}
|
|
return r
|
|
}
|
|
|
|
func SliceIntToInt32(s []int) []int32 {
|
|
r := make([]int32, 0, len(s))
|
|
for _, v := range s {
|
|
r = append(r, int32(v))
|
|
}
|
|
return r
|
|
}
|
|
|
|
func PopElemSlice(s []int, Id int) ([]int, bool) {
|
|
for k, v := range s {
|
|
if v == Id {
|
|
return append(s[0:k], s[k+1:]...), true
|
|
}
|
|
}
|
|
return s, false
|
|
}
|
|
|
|
func ElemInSlice(s []int, Id int) bool {
|
|
for _, v := range s {
|
|
if v == Id {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func GetElemNum(s []int, Id int) int {
|
|
n := 0
|
|
for _, v := range s {
|
|
if v == Id {
|
|
n++
|
|
}
|
|
}
|
|
return n
|
|
}
|
|
|
|
func InArray(Id int, s []int) bool {
|
|
for _, v := range s {
|
|
if v == Id {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func InStringArray(Id string, s []string) bool {
|
|
for _, v := range s {
|
|
if v == Id {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// toInterfaceSlice converts a slice of strings to a slice of empty interfaces
|
|
func ToInterfaceSlice(slice []string) []interface{} {
|
|
result := make([]interface{}, len(slice))
|
|
for i, v := range slice {
|
|
result[i] = v
|
|
}
|
|
return result
|
|
}
|
|
|
|
// a - b
|
|
func SubSlices(a, b []int) []int {
|
|
result := make([]int, 0, len(a))
|
|
for _, num := range a {
|
|
if !InArray(num, b) {
|
|
result = append(result, num)
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
func PopSlice(s []int) (int, []int) {
|
|
if len(s) == 0 {
|
|
return -1, s
|
|
}
|
|
return s[0], s[1:]
|
|
}
|
|
|
|
func SliceEqual(a, b []int) bool {
|
|
if len(a) != len(b) {
|
|
return false
|
|
}
|
|
sort.Ints(a)
|
|
sort.Ints(b)
|
|
for k, v := range a {
|
|
if v != b[k] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func InitNumSlice(start, end int) []int {
|
|
result := make([]int, 0, end-start+1)
|
|
for i := start; i <= end; i++ {
|
|
result = append(result, i)
|
|
}
|
|
return result
|
|
}
|
|
|
|
func IntSliceToString(slice []int) string {
|
|
str := fmt.Sprintf("%v", slice)
|
|
str = strings.Trim(str, "[]")
|
|
return str
|
|
}
|
|
|
|
func PopStringArray(s []string) (string, []string) {
|
|
if len(s) == 0 {
|
|
return "", s
|
|
}
|
|
return s[0], s[1:]
|
|
}
|
|
|
|
func ShuffleStringArray(s []string) []string {
|
|
r := make([]string, len(s))
|
|
perm := GetRand().Perm(len(s))
|
|
for i, v := range perm {
|
|
r[v] = s[i]
|
|
}
|
|
return r
|
|
}
|
|
|
|
func ShuffleArray(s []int) []int {
|
|
r := make([]int, len(s))
|
|
perm := GetRand().Perm(len(s))
|
|
for i, v := range perm {
|
|
r[v] = s[i]
|
|
}
|
|
return r
|
|
}
|
|
|
|
func IsContain(s []int, s2 []int) bool {
|
|
for _, v := range s2 {
|
|
if !InArray(v, s) {
|
|
return false
|
|
}
|
|
s = SubSlices(s, []int{v})
|
|
}
|
|
return true
|
|
}
|
|
|
|
func IsSameElem(s []int) bool {
|
|
r := make(map[int]struct{})
|
|
for _, v := range s {
|
|
if _, ok := r[v]; ok {
|
|
return true
|
|
}
|
|
r[v] = struct{}{}
|
|
}
|
|
return false
|
|
}
|