Golang如何对字节数组进行唯一排序

Golang如何对字节数组进行唯一排序 我有一个包含重复值的字节数组。我想对字节数组进行唯一排序。 相同的输出是:

[{
    "TIMESTAMP": "11-15-2019 at 09:35",
    "STATUS": " CLOSED",
    "DESCRIPTION": " Case closed "
},
{
    "TIMESTAMP": "11-15-2019 at 09:35",
    "STATUS": " CLOSED",
    "DESCRIPTION": " Case closed "
},
{
    "TIMESTAMP": "11-15-2019 at 09:35",
    "STATUS": " CLOSED",
    "DESCRIPTION": " Case closed "
},
{
    "TIMESTAMP": "11-15-2019 at 09:35",
    "STATUS": " CLOSED",
    "DESCRIPTION": " Case closed "
},
{
    "TIMESTAMP": "11-15-2019 at 09:35",
    "STATUS": " CLOSED",
    "DESCRIPTION": " Case closed "
},
{
    "TIMESTAMP": "11-15-2019 at 09:35",
    "STATUS": " CLOSED",
    "DESCRIPTION": " Case closed "
}]

由于 "STATUS": " CLOSED" 是重复的,我想进行唯一排序。 有什么方法可以做到这一点吗?


更多关于Golang如何对字节数组进行唯一排序的实战教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

谢谢

更多关于Golang如何对字节数组进行唯一排序的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是否有任何可以参考的帮助文档,请分享给我。

如果你有其他参考资料,请分享。在此期间,我会查看 sort 包。

sort的文档。

你还需要更多信息吗?

我只想要唯一的条目。我已经尝试过 sort.Sort()sort.Strings() 来对切片进行排序。

抱歉,除了文档之外,我没有任何其他资料,因为我认为文档已经足够了。

至少对于第一步来说是这样。

去重操作在排序后通过循环可以很简单地完成:如果当前元素等于前一个元素,就丢弃它;否则就保留它。

这不是一个“字节数组”,看起来更像是映射切片。

另外,你具体想做什么?你是想去重重复的条目,还是想全局消除重复的条目,即使其他条目在中间?

到目前为止,你为实现目标尝试了什么?

我们中的许多人不想从头开始做你的工作,而是更愿意使用你的代码,并将其推向正确的方向。

由于您没有实现 sort.Interfacesort.Sort 无法工作;同样,由于您没有字符串切片,sort.String 也无法工作。到目前为止,这都在意料之中。

此外,仅仅排序并不是您想要的,因为排序只会进行排序,重复项仍会保留在原地,不过在排序之后,您应该能够轻松地应用去重算法。

但是,由于您无法为 map 切片实现 sort.Interface,您首先需要创建一个中间数据类型。

在Go中对字节数组进行唯一排序,可以使用map来去重,然后对结果进行排序。以下是几种实现方法:

方法1:使用map和sort包

package main

import (
    "fmt"
    "sort"
)

func uniqueSortedBytes(data []byte) []byte {
    // 使用map去重
    seen := make(map[byte]bool)
    unique := []byte{}
    
    for _, b := range data {
        if !seen[b] {
            seen[b] = true
            unique = append(unique, b)
        }
    }
    
    // 排序
    sort.Slice(unique, func(i, j int) bool {
        return unique[i] < unique[j]
    })
    
    return unique
}

func main() {
    data := []byte{5, 2, 8, 2, 5, 1, 8, 9, 1}
    result := uniqueSortedBytes(data)
    fmt.Println(result) // 输出: [1 2 5 8 9]
}

方法2:使用sort和循环去重

package main

import (
    "fmt"
    "sort"
)

func uniqueSortedBytes(data []byte) []byte {
    if len(data) == 0 {
        return data
    }
    
    // 先排序
    sort.Slice(data, func(i, j int) bool {
        return data[i] < data[j]
    })
    
    // 再去重
    j := 0
    for i := 1; i < len(data); i++ {
        if data[j] != data[i] {
            j++
            data[j] = data[i]
        }
    }
    
    return data[:j+1]
}

func main() {
    data := []byte{3, 1, 4, 1, 5, 9, 2, 6, 5, 3}
    result := uniqueSortedBytes(data)
    fmt.Println(result) // 输出: [1 2 3 4 5 6 9]
}

方法3:通用函数处理任意类型切片

package main

import (
    "fmt"
    "sort"
)

func uniqueSorted[T comparable](data []T) []T {
    if len(data) == 0 {
        return data
    }
    
    // 去重
    seen := make(map[T]bool)
    unique := []T{}
    
    for _, v := range data {
        if !seen[v] {
            seen[v] = true
            unique = append(unique, v)
        }
    }
    
    // 排序需要类型约束
    sortSlice(unique)
    return unique
}

// 为可比较类型实现排序
func sortSlice[T comparable](data []T) {
    sort.Slice(data, func(i, j int) bool {
        // 这里需要根据具体类型实现比较逻辑
        // 对于byte/int等基本类型可以直接比较
        switch v := any(data[i]).(type) {
        case byte:
            return v < any(data[j]).(byte)
        case int:
            return v < any(data[j]).(int)
        case string:
            return v < any(data[j]).(string)
        default:
            return false
        }
    })
}

func main() {
    // 处理字节数组
    bytes := []byte{7, 3, 7, 1, 3, 2, 7}
    result1 := uniqueSorted(bytes)
    fmt.Println("Bytes:", result1) // 输出: [1 2 3 7]
    
    // 处理整数数组
    ints := []int{5, 2, 8, 2, 5, 1}
    result2 := uniqueSorted(ints)
    fmt.Println("Ints:", result2) // 输出: [1 2 5 8]
}

方法4:针对JSON数据的处理

根据你的JSON示例,你可能需要处理结构体数组的去重排序:

package main

import (
    "encoding/json"
    "fmt"
    "sort"
)

type Record struct {
    Timestamp  string `json:"TIMESTAMP"`
    Status     string `json:"STATUS"`
    Description string `json:"DESCRIPTION"`
}

func uniqueSortedRecords(records []Record) []Record {
    if len(records) == 0 {
        return records
    }
    
    // 使用map基于Status字段去重
    seen := make(map[string]bool)
    unique := []Record{}
    
    for _, r := range records {
        if !seen[r.Status] {
            seen[r.Status] = true
            unique = append(unique, r)
        }
    }
    
    // 按Status排序
    sort.Slice(unique, func(i, j int) bool {
        return unique[i].Status < unique[j].Status
    })
    
    return unique
}

func main() {
    jsonData := `[
        {"TIMESTAMP": "11-15-2019 at 09:35", "STATUS": " CLOSED", "DESCRIPTION": " Case closed "},
        {"TIMESTAMP": "11-15-2019 at 09:35", "STATUS": " CLOSED", "DESCRIPTION": " Case closed "},
        {"TIMESTAMP": "11-15-2019 at 09:36", "STATUS": " OPEN", "DESCRIPTION": " Case opened "},
        {"TIMESTAMP": "11-15-2019 at 09:35", "STATUS": " CLOSED", "DESCRIPTION": " Case closed "},
        {"TIMESTAMP": "11-15-2019 at 09:37", "STATUS": " PENDING", "DESCRIPTION": " Case pending "}
    ]`
    
    var records []Record
    json.Unmarshal([]byte(jsonData), &records)
    
    uniqueRecords := uniqueSortedRecords(records)
    
    for _, r := range uniqueRecords {
        fmt.Printf("Status: %s\n", r.Status)
    }
    // 输出:
    // Status:  CLOSED
    // Status:  OPEN
    // Status:  PENDING
}

这些方法可以根据你的具体需求选择使用。对于简单的字节数组,方法1和方法2最直接;如果需要处理JSON结构体数据,方法4更合适。

回到顶部